博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Home键监听
阅读量:6119 次
发布时间:2019-06-21

本文共 4302 字,大约阅读时间需要 14 分钟。

Back键的监听  对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件:    @Override    public void onBackPressed() {        // super.onBackPressed();//注释掉这行,back键不退出activity        Log.i(LOG_TAG, "onBackPressed");    }    @Override    public boolean dispatchKeyEvent(KeyEvent event) {        Log.i(LOG_TAG, "dispatchKeyEvent: keyCode -- " + event.getKeyCode());        return super.dispatchKeyEvent(event);    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        Log.i(LOG_TAG, "onKeyDown: keyCode -- " + keyCode);        switch (keyCode) {        case KeyEvent.KEYCODE_BACK:            Log.i(LOG_TAG, "KeyEvent.KEYCODE_BACK");            break;        case KeyEvent.KEYCODE_MENU:            Log.i(LOG_TAG, "KeyEvent.KEYCODE_MENU");            break;        case KeyEvent.KEYCODE_HOME:            Log.i(LOG_TAG, "KeyEvent.KEYCODE_HOME");            // 收不到            break;        case KeyEvent.KEYCODE_APP_SWITCH:            Log.i(LOG_TAG, "KeyEvent.KEYCODE_APP_SWITCH");            // 收不到            break;        default:            break;        }        return super.onKeyDown(keyCode, event);    } Home键的广播监听  对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所以在上述监听Back键的代码中,相应的回调中是收不到Home键的事件的.  参考文后的博客链接,对Home键的监听主要通过注册广播接收器实现,拦截让窗口关闭的系统动作,然后根据Intent里面的具体参数,分析当前到底是Home键, 应用切换键,还是其他功能按键.  接收器实现如下:复制代码package com.mengdd.hellohome;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class HomeWatcherReceiver extends BroadcastReceiver {    private static final String LOG_TAG = "HomeReceiver";    private static final String SYSTEM_DIALOG_REASON_KEY = "reason";    private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";    private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";    private static final String SYSTEM_DIALOG_REASON_LOCK = "lock";    private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        Log.i(LOG_TAG, "onReceive: action: " + action);        if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {            // android.intent.action.CLOSE_SYSTEM_DIALOGS            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);            Log.i(LOG_TAG, "reason: " + reason);            if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {                // 短按Home键                Log.i(LOG_TAG, "homekey");            }            else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {                // 长按Home键 或者 activity切换键                Log.i(LOG_TAG, "long press home key or activity switch");            }            else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) {                // 锁屏                Log.i(LOG_TAG, "lock");            }            else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) {                // samsung 长按Home键                Log.i(LOG_TAG, "assist");            }        }    }}  注意不同手机的按键不同,所以需要对不同理由做区分. Home键监听广播注册  广播接收器的注册有两种方式,一种是静态注册,即写在manifest里面声明;另一种是动态注册,即在Java代码里面注册.  上面对Home键实现监听的这个receiver,静态注册如下:        
  但是发现静态注册不起作用,即收不到onReceive回调.   采用动态注册: private static HomeWatcherReceiver mHomeKeyReceiver = null; private static void registerHomeKeyReceiver(Context context) { Log.i(LOG_TAG, "registerHomeKeyReceiver"); mHomeKeyReceiver = new HomeWatcherReceiver(); final IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); context.registerReceiver(mHomeKeyReceiver, homeFilter); } private static void unregisterHomeKeyReceiver(Context context) { Log.i(LOG_TAG, "unregisterHomeKeyReceiver"); if (null != mHomeKeyReceiver) { context.unregisterReceiver(mHomeKeyReceiver); } }    在Activity的onResume和onPause里面分别调用: @Override protected void onResume() { super.onResume(); registerHomeKeyReceiver(this); } @Override protected void onPause() { unregisterHomeKeyReceiver(this); super.onPause(); }  当然也可以根据需要在其他合适的时机注册和注销. 参考资料  http://blog.csdn.net/way_ping_li/article/details/8953622

 

你可能感兴趣的文章
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>
设计模式(十一):FACADE外观模式 -- 结构型模式
查看>>
iOS xcodebuile 自动编译打包ipa
查看>>
程序员眼中的 SQL Server-执行计划教会我如何创建索引?
查看>>
【BZOJ】1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
查看>>
cmake总结
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
IIS7如何显示详细错误信息
查看>>
ViewPager切换动画PageTransformer使用
查看>>
coco2d-x 基于视口的地图设计
查看>>