Android app:如何让 App 拿到Power key 值

原文(有删改):https://blog.csdn.net/qq_37858386/article/details/103835664

介绍

默认机制:Power key 通常都是由 framework 自行的 处理的, app 无法拿到这个 key 值的。

修改

Framework

路径:frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

PhoneWindowManager主要用于实现各种实体或虚拟按键处理。

修改interceptKeyBeforeQueueing方法,把case KeyEvent.KEYCODE_POWER部分做如下修改:

其中,com.example.keyeventdemo是需要获取power事件app的包名:

case KeyEvent.KEYCODE_POWER: {
Log.d(TAG,"detect power key in special package, pass to user! "+KeyEvent.KEYCODE_POWER);
result &= ~ACTION_PASS_TO_USER;
// add-start
ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
try{
if (activityManager.getRunningTasks(1).get(0).topActivity.getPackageName().equals("com.example.keyeventdemo")){
//Please reset the special package name.
result |= ACTION_PASS_TO_USER;
Log.d(TAG,"detect power key in special package, pass to user!");
}
}catch(NullPointerException e){
Log.d(TAG,"ingore a NullPointerException ..");
}
// add-end // others code
}

app

三、实际测试ok,按下power键没有灭屏幕,app获取到该事件。

四、app测试代码

public class MainActivity extends AppCompat Activity {
private Textview key_result;
private String desc = ""; @0verride
protected void onCreate(Bundle savedInst anceSt ate) {
super.onCreate(savedInstanceState);
setCont entView(R.1ayout.activity_main);
key_result =(TextView) findViewById(R. id.key_result);
@0verride
public boolean onKeyDown(int keyCode,KeyEvent event) {
desc = String.format("%sphysical key coce is %i", desc, keyCode);
if (keyCode == KeyEvent.KEYCODE_BACK)
{
desc = String.format("%s,KEYCODE BACK",desc);
} else if (keyCode == KeyEvent.KEYCODE_MENU ) {
desc = String.format("%s,KEYCODE_MEN",desc);
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP);{
desc = String.format("%s, KEYCODE_VOLUME_UP", desc);
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWD){
desc = String.format("%s,KEYCODE_VOLUME_DOWN", desc);
}else if (keyCode == KeyEvent. KEYCODE_POWER){
desc = String.format("%s, KEYCODE_POWER", desc);
}else {
desc = String.format("%s, KEYCODE_VOLUME is unknown", desc);
}
desc = desc + "\n";
key_result.set Text (desc) ;
//返回true表示不再响应系统动作,返回false表示继续响应系统动作return true;
// return false:
}
}
}

Android Framework:如何让 App 拿到Power key 值的更多相关文章

  1. Android 如何让 app 自行处理 power key M

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  2. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发

    掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...

  3. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  4. 北京联想招聘-Android Framework高级工程师(7-10年) 加入qq 群:220486180 或者直接在此 留言咨询

    Job ID #: 45038 Position Title: Android Framework高级工程师 Location: CHN-Beijing Functional Area: Resear ...

  5. 如何调试Android Framework?

    Linus有一句名言广为人知:Read the fucking source code. 但其实,要深入理解某个软件.框架或者系统的工作原理,仅仅「看」代码是远远不够的.就拿Android Frame ...

  6. 解析android framework下利用app_process来调用java写的命令及示例

    解析android framework下利用app_process来调用java写的命令及示例 在android SDK的framework/base/cmds目录下了,有不少目录,这些目的最终都是b ...

  7. Android Studio搭建系统App开发环境

    一.前言 在Android的体系中开发普通app使用Android Studio这一利器会非常的方便.但是开发系统app可能就会有些吃力,不过经过一些配置仍然会 很简单.我们知道系统app因为涉及到一 ...

  8. [Android][Framework] 添加系统服务

    新博客地址 http://wossoneri.github.io/2018/09/15/[Android][Framework]create-system-service/ 做系统开发,有时候需要自己 ...

  9. [Android][Framework]裁剪SystemServer服务以及关闭SystemFeature

    本文链接 http://wossoneri.github.io/2018/08/30/[Android][Framework]crop-SystemServer-and-SystemFeature/ ...

  10. Android Framework 简介

    Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...

随机推荐

  1. C语言笔记001-用C语言编写程序

    例2-1  在屏幕上显示一个短句"Hello World!". #include <stdio.h> int main(void) { printf("hel ...

  2. Oracle和达梦:查询系统表、系统表字段

    1.查询系统表 当前模式下所有的表 可以查询到:表名.表注释 select * from user_tab_comments where TABLE_TYPE = 'TABLE' 2.查询系统表字段 ...

  3. fork后更新仓库代码

    目录 fork后更新仓库代码 场景: 模型 操作方法如下: 方法一.从github上进行操作然后更新 如何在 Github 网页端同步更新? 方法二.通过命令行fetch拉取原仓库更新 fork后更新 ...

  4. Deepin安装Python3

    https://www.jianshu.com/p/0c61bdfb9589 也可以看这篇,本文是这篇的简捷版,均原创 首先,把系统更到最新,并复制下面的代码 sudo apt update 更新软件 ...

  5. Java IO流文件

    Java IO流文件 创建文件 使用File类进行创建文件操作,创建该对象包含三种构造方法 new File(String pathname); //根据路径+文件名创建一个File对象 new Fi ...

  6. C# 记一次对chm帮助文档的信息提取

    事情时这样,有用友u8的字典数据的帮助文档一份,同事需要把里面的很多张表的字典信息给提取出来,然后构成sql语句,插入数据库.字典就是一张对表里的字段的一个说明,长这样 同事一开始是手动复制到exce ...

  7. Linux权限与组

    rwx r-xr r-x root root r:读 (read) 4 w:写(write) 2 x:执行(execute) ``1 - 没有权限 0 权限 的前三位 rwx 属主权限位(用户权限) ...

  8. 调试YOLOv3/YOLOv5过程中遇到的问题汇总

    今日立冬 yolov1 yolo1论文 https://www.bilibili.com/video/BV15w411Z7LG yolo2论文 https://www.bilibili.com/vid ...

  9. OpenCV笔记(6) Bitwise

    源码: BitwiseAnd   //dst = src1 & src2 public static void BitwiseAnd(InputArray src1, InputArray s ...

  10. 多项分布模拟及 Seaborn 可视化教程

    多项分布 简介 多项分布是二项分布的推广,它描述了在 n 次独立试验中,k 种不同事件分别出现次数的离散概率分布.与二项分布只能有两种结果(例如成功/失败)不同,多项分布可以有 k 种(k ≥ 2)及 ...