Android 监听Home键按键事件

标签(空格分隔):Android Home键


在Android开发中有很多按键事件需要在App中捕获从而做出一些针对性的操作,例如返回键,音量键等都可以直接在dispatchKeyEventonKeyDown等回调方法中捕获,但是Home键事件却不能在这个方法中捕获。在Android源码KeyEvent中对于Home键的定义有这样的注释:
This key is handled by the framework and is never delivered to applications.
就是说Home被系统Framework拦截了,并且不会抛出来让App捕获。

但是,很多时候需要在App中捕获Home键的按键事件并作出一些操作。查资料会发现大家都推荐去监听ACTION_CLOSE_SYSTEM_DIALOGS这个系统广播,在按下Home键后系统会发出这个广播,是不是可靠,我们来看下Android framework的源码。

先不管Android怎么从底层一步步把按键事件传递上来,这里直接从Framework中的PhoneWindowManager方法开始分析。

按键事件会在PhoneWindowManager中的interceptKeyBeforeDispatching方法中进行一些预处理,Home键的事件就是在这里被拦截并处理。

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {final int keyCode = event.getKeyCode();final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;/** 这里省略不知道多少代码 */if (keyCode == KeyEvent.KEYCODE_HOME) {/** 这里也省略不知道多少代码 */handleShortPressOnHome();return -1;}

可以看到短按Home键最终是调用handleShortPressOnHome这个方法,那我们来看下这个方法中究竟干了啥?

private void handleShortPressOnHome() {// Turn on the connected TV and switch HDMI input if we're a HDMI playback device.getHdmiControl().turnOnTv();// If there's a dream running then use home to escape the dream// but don't actually go home.if (mDreamManagerInternal != null && mDreamManagerInternal.isDreaming()) {mDreamManagerInternal.stopDream(false /*immediate*/);return;}// Go home!launchHomeFromHotKey();
}

可以看到这里最终调用了launchHomeFromHotKey这个方法。

void launchHomeFromHotKey(final boolean awakenFromDreams, final boolean respectKeyguard) {if (respectKeyguard) {if (isKeyguardShowingAndNotOccluded()) {// don't launch home if keyguard showingreturn;}if (!mHideLockScreen && mKeyguardDelegate.isInputRestricted()) {// when in keyguard restricted mode, must first verify unlock// before launching homemKeyguardDelegate.verifyUnlock(new OnKeyguardExitResult() {@Overridepublic void onKeyguardExitResult(boolean success) {if (success) {try {ActivityManagerNative.getDefault().stopAppSwitches();} catch (RemoteException e) {}sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);startDockOrHome(true /*fromHomeKey*/, awakenFromDreams);}}});return;}}

可以看到最后调用了sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);这个方法里面就有我们要找的答案。

这个方法的实现如下:

void sendCloseSystemWindows(String reason) {PhoneWindow.sendCloseSystemWindows(mContext, reason);
}

这里调到了PhoneWindow里面的

public static void sendCloseSystemWindows(Context context, String reason) {if (ActivityManagerNative.isSystemReady()) {try {ActivityManagerNative.getDefault().closeSystemDialogs(reason);} catch (RemoteException e) {}}
}

这个方法中调用的ActivityManagerNative.getDefault()本质是通过jnibinder调用得到ActivityManagerService的实例,调用ActivityManagerServicecloseSystemDialogs方法,这个方法最终调用ActivityManagerServicecloseSystemDialogsLocked方法:

void closeSystemDialogsLocked(String reason) {Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY| Intent.FLAG_RECEIVER_FOREGROUND);if (reason != null) {intent.putExtra("reason", reason);}mWindowManager.closeSystemDialogs(reason);mStackSupervisor.closeSystemDialogsLocked();broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null,AppOpsManager.OP_NONE, null, false, false,-1, Process.SYSTEM_UID, UserHandle.USER_ALL);
}

这里就是答案了,可以看出这里最终通过broadcastIntentLocked发送了ACTION_CLOSE_SYSTEM_DIALOGS广播

至于具体的代码实现可以参考我封装的一个类HomeKeyListener

Android 监听Home键按键事件相关推荐

  1. 蓝牙耳机按键事件linux,【记录】Android监听蓝牙耳机的按键事件

    Android监听蓝牙耳机的按键事件 一.本文测试环境: 1.使用Dacom M10蓝牙耳机 2.成功监测到"电话键"(音量键没有监测到) 3.参考资料 4.参考源码 二.一些说明 ...

  2. Android怎样监听蓝牙耳机的按键事件

    Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...

  3. Android如何监听蓝牙耳机的按键事件(转)

    源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...

  4. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plaincopy @Override pub ...

  5. android 应用监听home键,Android 监听Home键

    搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. private final BroadcastReceiver homeRece ...

  6. Android锁屏界面监听按键,Android 监听锁屏/开屏事件

    1. 两种方案 (1) 监听BroadcastReceiver (2)获取PowerManager事件 2.  BroadcastReceiver 2.1. 事件 总共有3个事件: Intent.AC ...

  7. Android 监听Home键、Back键、多任务键最新解决方法

    前言 在开发中,我们可以经常看金融银行之类APP,退到后台都会给出提示,提高安全性.实现这种功能就需要去监听系统的按键操作,最常用的就是监听Back键.Home键和多任务键. 但是Android系统默 ...

  8. Android 监听软键盘按键的三种方式

    前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"Go"按键加载url页面:在点击搜索框的时候,点 ...

  9. Android 监听Home键

    2019独角兽企业重金招聘Python工程师标准>>> 游戏需要统计用户退出游戏是按的返回键还是home,因为返回键是自己cocos2dx做的监听,所以这里说一下android Ac ...

最新文章

  1. 网络摄像头+net_今日 Paper | 神经网络结构搜索;视觉目标;人物识别;视频3D人体姿态估计等...
  2. 马哥linux脚本,linux学习 – shell脚本
  3. Javascript基础系列之(五)条件语句(比较操作符)
  4. JSP学习笔记(六十二):struts2中的Lambda表达式
  5. Git HTTP方式克隆远程仓库到本地
  6. Jvm工作原理学习笔记(转)
  7. Android 记忆卡片游戏 记忆力 Android游戏 Android记忆卡片游戏源代码
  8. 管理新语:主管要辅导员工转正
  9. 近百个常用js代码汇总
  10. SpringMVC Redirect 跳转后保存Model中的数据
  11. Vue Cli 3代理配置
  12. Tarjan 算法解决 LCA 问题
  13. 《数据结构教程(李春葆主编 第五版)》第一章源代码 + 《数据结构》上机实验(第九章) —查找
  14. Go语言学习系列 -- 大道至简—GO语言最佳实践​​​​​​​
  15. 找出成绩全及格的学生(python)实现
  16. 计算机硬盘空间不足怎么删,Win10硬盘空间不足?教你这样清理,瞬间多出10个G!...
  17. ESP8266入门教程-ESP8266睡眠和唤醒功能
  18. 核密度聚类(一)核函数、核密度估计、核密度聚类
  19. 三重积分的球面坐标系的体积元素表示
  20. 一日一测(20170117~20170917)

热门文章

  1. 显示器购买攻略【小白必看】
  2. Hexo系列matery主题踩坑优化记录
  3. 1. Arthas的命令
  4. Android Q SQLite性能问题调研
  5. golang导入私有仓库报错:“server response: not found:xxx: invalid version: git ls-remote -q origin in xxx“
  6. OpenGL 笔记-1配置和常用宏
  7. 数据库插入、删除、修改语句
  8. 计算机微机维修工四级理论知识试卷,计算机维修工中级理论知识试卷2
  9. WinRAR分卷压缩与解压缩
  10. python计算中文文件字数_完成计算文本文件字数的Python代码实例