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. 11K+ Star!图解计算机网络、操作系统、计算机组成、数据库!

    大家好,我是 Java陈序员. 俗话说得好,面试造火箭,入职拧螺丝.我们在工作中,其实很少用到一些计算机底层知识,往往只要编码完事.但是,知其然还要知其所以然,我们不仅要做一个合格的"CV ...

  2. CSP-S2023游记

    不知不觉也高二了呢,最后一年OI了. Day -?? 过了初赛.没什么难度. Day -4 模拟赛挂分. RP++. Day -3 模拟赛挂分. RP++. Day -2 没挂分--?换数据了,又挂了 ...

  3. VMware Workstation Pro各版本下载链接汇总(特全!!!)

    VMware Workstation Pro各版本下载链接汇总 (10.11.12.14.15.16官网全版本) 整理不易,点赞关注一下吧 工具软件:VMware Workstation Pro 1. ...

  4. 特工17Agent17汉化版游戏破解金币方法修改破解金币的增加方法

    又是一个renpy游戏,昨晚搞了半个小时搞定的,其实这个游戏要赚钱也不难,就是点点点就可以了,但是我觉得还是挺费劲的,因为好多道具都很贵,攒钱又不怎么容易,花钱的地方还挺多的,所以干脆不如直接破解了算 ...

  5. homebrew的安装和使用

    目录 背景 安装xcode 安装homebrew 有关报错解决 卸载脚本 homebrew软件搜索 brew 常用命令 brew redis安装 PhpWebStudy安装 安装php 背景 最近用b ...

  6. Git基本操作命令大全

    一.全局配置命令 ## 配置级别: –local(默认,高级优先):只影响本地仓库 –global(中优先级):只影响所有当前用户的git仓库 –system(低优先级):影响到全系统的git仓库 # ...

  7. element-ui使用el-date-picker日期组件常见场景

    开始 最近一直在使用 element-ui中的日期组件. 所以想对日期组件常用的做一个简单的总结: 1.处理日期组件选择的时候面板联动问题 2.限制时间范围 解除两个日期面板之间的联动 我们发现2个日 ...

  8. PasteSpider之appsettings.json中的Serilog的配置,分流不同日志层级的信息!

    在实际使用Serilog中,我们通常会有不一样的需求,常见的比如 1.按照等级,高级哪个等级的才记录 2.记录文件每个多大,超过的划分到下一个文件中 3.不同等级的记录到不同的位置中 4.按照不一样的 ...

  9. .NET Core 中使用GBK GB2312编码报错的问题

    错误描述 环境 dotnet core 2.1 2.2   dotnet core 3.1 dotnet core 5.0 现象 当代码中使用 System.Text.Encoding.GetEnco ...

  10. JavaScript 中的 Range 和 Selection 对象

    JavaScript 中的 Range 和 Selection 对象 前言 最近在做鼠标框选的需求,鼠标框选就需要用到 Range 和 Selection 对象. Range 表示选择的区间范围,Se ...