Android 9-- 源码角度: Home键的监听和拦截

 在做应用层APP需求的过程中,HOME键的监听,Back键的监听,这都是很常见的问题,那你有试过,去拦截HOME键的事件吗,有去了解过如何处理吗,流程如何

首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下Home键的三种情况。

 1、在应用中按下Home键的逻辑处理 

xref: /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

这是源码的具体类跟地址

创建一个启动到桌面的Intent。

Intent mHomeIntent;mHomeIntent = new Intent(Intent.ACTION_MAIN, null);mHomeIntent.addCategory(Intent.CATEGORY_HOME);mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);startActivity(mHomeIntent);

 2、在应用中监听Home键 

在Android应用中如果想监听Home键可以使用广播机制,这个在源码中也有体现。

这样就可以监听Home的是否被按下。

static public final String SYSTEM_DIALOG_KEY = "reason";static public final String SYSTEM_DIALOG_GLOBAL_ACTIONS = "globalactions";static public final String SYSTEM_DIALOG_RECENT_APPS = "recentapps";static public final String SYSTEM_DIALOG_HOME_KEY = "homekey";static public final String SYSTEM_DIALOG_ASSIST = "assist";@Overridepublic void onReceive(Context arg0, Intent arg1) {String action = arg1.getAction();//按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {String reason = arg1.getStringExtra(SYSTEM_DIALOG_KEY);if (reason != null) {if (reason.equals(SYSTEM_DIALOG_HOME_KEY)) {// 短按home键Toast.makeText(arg0, "短按Home键", Toast.LENGTH_SHORT).show();} else if (reason.equals(SYSTEM_DIALOG_RECENT_APPS)) {// RECENT_APPS键Toast.makeText(arg0, "RECENT_APPS", Toast.LENGTH_SHORT).show();}}}}

3、在Frameworks层拦截Home键

xref: /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

直接在onKeyDown中判断通过keyCode == KeyEvent.KEYCODE_HOME是不能拦截的

/** {@inheritDoc} */@Overridepublic long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
......
// First we always handle the home key here, so applications// can never break it, although if keyguard is on, we do let// it handle it, because that gives us the correct 5 second// timeout.if (keyCode == KeyEvent.KEYCODE_HOME) {// If we have released the home key, and didn't do anything else// while it was pressed, then it is time to go home!if (!down) {//添加的判断当前前台运行APP代码if (!isBackgroundActivity(mContext, PKG_NAME_xxxxx)) {Log.d(TAG, "xxxx app is foreground");if (!getTopActivity(mContext).equals(ACTIVITY_NAME_xxxx)) {                                                          Log.d(TAG, "xxxxx app is foreground activity");return -1;}return -1;}cancelPreloadRecentApps();mHomePressed = false;if (mHomeConsumed) {mHomeConsumed = false;return -1;}......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52551.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-boot-maven-plugin使用

spring-boot-maven-plugin这个插件有7个目标: spring-boot:build-image 使用构建包将应用程序打包到OCI映像中。 spring-boot:build-info 根据当前MavenProject spring-boot:help 显示有关spring-boot-maven插件的帮助信息。 调用mvn-spring-boot:help-Ddetailtr…

Vue前端框架入门

文章目录 Vue快速入门Vue指令生命周期 Vue 经过一小段时间学习 我认为vue就是在原js上进行的一个加强 简化JS中的DOM操作 vue是分两个层的 一个叫做视图层(View),你可以理解为展现出来的前端页面 一个叫数据模型层(Model),包含数据和一些数据的处理方法 MVVM就是实…

P14 电路定理——巧妙-灵性-智慧

1、替代定理 图示表示: 叠加定理和齐性定理只能用于线性电路,但是替代定理无论线不线性都可以用。 常见的:线性电路将某复杂支路等效成电压源或电流源之后,就可以使用叠加原理了。 引入两个相互抵消的电压源,拿其中一…

【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

文章目录 ARM ORG 指令介绍UEFI 中对 ORG 指令的使用 ARM ORG 指令介绍 在ARM汇编中,"org"是一个汇编器伪指令,用于设置下一条指令的装入地址。"org"后面跟着的是一个表达式,这个表达式的值就是下一条指令的装入地址。如…

Linux 系统编程 开篇/ 文件的打开/创建

从本节开始学习关于Linux系统编程的知识! 学习Linux的系统编程有非常多的知识点,在应用层面,很重要的一点就是学习如何“用代码操作文件来实现文件创建,打开,编辑等自动化执行” 那如何自动化实现对文件的创建&#…

SSL 证书过期巡检脚本 (Python 版)

哈喽大家好,我是咸鱼 之前写了个 shell 版本的 SSL 证书过期巡检脚本 (文章:《SSL 证书过期巡检脚本》),后台反响还是很不错的 那么今天咸鱼给大家介绍一下 python 版本的 SSL 证书过期巡检脚本 (完整代码…

MATLAB | 如何绘制这样的描边散点图?

part.-1 前前言 最近略忙可能更新的内容会比较简单,见谅哇,今日更新内容: part.0 前言 看到gzhBYtools科研笔记(推荐大家可以去瞅瞅,有很多有意思的图形的R语言复现!!)做了这样一张图: 感觉很…

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒,左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…

STM32 低功耗-睡眠模式

STM32 睡眠模式 文章目录 STM32 睡眠模式第1章 低功耗模式简介第2章 睡眠模式简介2.1 进入睡眠模式2.1 退出睡眠模式 第3章 睡眠模式代码示例总结 第1章 低功耗模式简介 在 STM32 的正常工作中,具有四种工作模式:运行、睡眠、停止和待机模式。 在系统或…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板14

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

HotSpot虚拟机之Class文件及字节码指令

目录 一、javac编译 1. 编译过程 2. 语法糖 二、Class文件 1. 文件格式 2. 常量池项目 3. 属性类型 三、Class文件实例 1. 源代码 2. javap分析Class文件 四、字节码指令 五、参考资料 一、javac编译 1. 编译过程 javac命令由Java语言编写,目的将Ja…

C语言阶段性测试题

【前言】:本部分是C语言初阶学完阶段性测试题,最后一道编程题有一定的难度,需要多去揣摩,代码敲多了,自然就感觉不难了,加油,铁汁们!!! 一、选择题 1.下面程…