android power 按键,Android Framework层Power键关机流程(一,Power长按键操作处理)

一:Android处理Power按键长按操作

在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManager开始分析,在分析前我这里打印了该方法的堆栈调用信息。大家可以参考一下。

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

......

android.util.Log.d("BILL",android.util.Log.getStackTraceString(new Throwable()));

......

}

1-13 19:35:32.458 D/BILL    (  718): java.lang.Throwable

01-13 19:35:32.458 D/BILL    (  718):

at com.android.internal.policy.impl.PhoneWindowManager.interceptKeyBeforeDispatching(PhoneWindowManager.java:2224)

01-13 19:35:32.458 D/BILL    (  718):

at com.android.server.wm.InputMonitor.interceptKeyBeforeDispatching(InputMonitor.java:501)

01-13 19:35:32.458 D/BILL    (  718):

at com.android.server.input.InputManagerService.interceptKeyBeforeDispatching(InputManagerService.java:1383)

01-13 19:35:32.458 D/BILL    (  718):

at dalvik.system.NativeStart.run(Native Method)

调用流程如下(只贴出关键代码):

interceptKeyBeforeDispatching()-->interceptPowerKeyDown()-->mPowerLongPress.run()

1>

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

......

case KeyEvent.KEYCODE_POWER: {

result &= ~ACTION_PASS_TO_USER;

if (down) {

mImmersiveModeConfirmation.onPowerKeyDown(isScreenOn, event.getDownTime(),

isImmersiveMode(mLastSystemUiFlags));

if (isScreenOn && !mPowerKeyTriggered

&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {

mPowerKeyTriggered = true;

mPowerKeyTime = event.getDownTime();

interceptScreenshotChord();

}

ITelephony telephonyService = getTelephonyService();

boolean hungUp = false;

if (telephonyService != null) {

try {

if (telephonyService.isRinging()) {

// Pressing Power while there's a ringing incoming

// call should silence the ringer.

telephonyService.silenceRinger();

/// M: [ALPS00093981] @{

} else if ((isScreenOn

||  mScreenOffReason == OFF_BECAUSE_OF_PROX_SENSOR)

/// @}

&& (mIncallPowerBehavior

& Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP) != 0

&& telephonyService.isOffhook()) {

// Otherwise, if "Power button ends call" is enabled,

// the Power button will hang up any current active call.

hungUp = telephonyService.endCall();

}

} catch (RemoteException ex) {

Log.w(TAG, "ITelephony threw RemoteException", ex);

}

}

interceptPowerKeyDown(!isScreenOn || hungUp

|| mVolumeDownKeyTriggered || mVolumeUpKeyTriggered);

} else {

mPowerKeyTriggered = false;

cancelPendingScreenshotChordAction();

if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) {

result = (result & ~ACTION_WAKE_UP) | ACTION_GO_TO_SLEEP;

}

mPendingPowerKeyUpCanceled = false;

}

break;

}

......

}

注!红色为判断长按(down),蓝色为判断短按(up)。

2>

private void interceptPowerKeyDown(boolean handled) {

mPowerKeyHandled = handled;

if (!handled) {

mHandler.postDelayed(mPowerLongPress, ViewConfiguration.getGlobalActionKeyTimeout());

}

}

3>

private final Runnable mPowerLongPress = new Runnable() {

......

case LONG_PRESS_POWER_GLOBAL_ACTIONS:

mPowerKeyHandled = true;

if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) {

performAuditoryFeedbackForAccessibilityIfNeed();

}

sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

showGlobalActionsDialog();

break;

case LONG_PRESS_POWER_SHUT_OFF:

case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:

mPowerKeyHandled = true;

performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);

sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);

break;

......

};

注:上述代码中下划线即弹出(关机、重启、飞行模式等选项)的对话框。

Android Framework层Power键关机流程(二,关机流程)

二,关机流程 从前一篇博文我们知道,当用户长按Power键时会弹出(关机.重启,飞行模式等选项)对话框,我们点击关机,则会弹出关机确认对话框.那么从选项对话框到关机确认对话框又是一个什么流程呢.下面我 ...

怎样从C++代码直接訪问android framework层的WifiService

说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiSe ...

Android framework层实现实现wifi无缝切换AP

http://www.linuxidc.com/Linux/2013-12/93476.htm Android市场上有一款叫Wifijumper的软件,实现相同ssid的多个AP之间根据wifi信号的 ...

Android的NDK开发(5)————Android JNI层实现文件的read、write与seek操作

1. 在Android的Java层实现文件的读写操作是非常简单的,可以参看之前写的博文:http://blog.csdn.net/conowen/article/details/7296121 在JN ...

如何调试Android Framework?

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

Android 9.0 关机流程分析

极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

Android 屏蔽Power键 Home键

Android 屏蔽Power键 Home键 标签: androidpower键Home键PhoneWindowManagerframework 2014-04-18 17:22 1557人阅读 评论 ...

【Android】Sensor框架Framework层解读

Sensor整体架构 整体架构说明 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数 ...

Android开发如何定制framework层服务

刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...

随机推荐

FZU 2105Digits Count(线段树 + 成段更新)

Description Given N integers A={A[0],A[1],...,A[N-1]}. Here we have some operations: Operation 1: AN ...

深度学习框架 Torch 7 问题笔记

深度学习框架 Torch 7 问题笔记 1. 尝试第一个 CNN 的 torch版本, 代码如下: -- We now have 5 steps left to do in training our ...

LPTHW 笨办法学python 20章

本章节讲述了,函数和文件的综合操作. 分别 执行了.1.读出文件所有内容,2.把文件重置至文件开头.3.打印一行. 我在本节作了一个小小的改良,设置了一个全局变量,记录当前应该输入哪一行,如果执行过一 ...

[Windows] 批处理文件系统服务控制

在cmd下可有两种方法打开,net和sc. net只能用于用于打开没有被禁用的服务. 启动: net start 服务名 停止: net stop 服务名 sc可打开被禁用的服务. sc config ...

[Neural Networks] Momentum

一.目的 加快参数的收敛速度. 二.做法 另第t次的权重更新对第t+1次的权重更新造成影响. 从上式可看出,加入momentum后能够保持权重的更新方向,同时加快收敛.通常alpha的取值为[0.7, ...

delphi 线程池基础 TSimplePool

1. TSimpleThread 2. TSimpleList 3. 以1,2构成 TSimplePool 用法 先定义: TDoSomeThingThread=class(TSimpleThread ...

mysql 获取一张表中, 另一张表不存在的数据

编写sql语句中,经常需要编写获取一张数据表中不存在与另一张表的数据,相关编写方法如下: 方法1: 使用not in ,效率低下,在数据较小的情况下可以采用如下编写 SELECT * FROM a A ...

JAVA 的输入与输出流当中,什么时候该使用字符流?什么时候该使用字节流?

1. InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象, 2. Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来 ...

mac电脑读写NTFS格式的移动硬盘命令

diskutil info /Volumes/SAMSUNG | grep UUID echo "UUID=38EBE5E4-016F-44B7-9D55-BB4AF6DC3E1D none ...

hihoCoder #1143 : 骨牌覆盖问题·一

#1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...

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

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

相关文章

4岁小女孩给Linux内核贡献提交

今天在reddit上看到一个有趣的讨论,一个4岁的小女孩给Linux提交了一个补丁,并且这个补丁合并到了代码中。链接如下:https://www.reddit.com/r/linux/comments/2pqqla/kernel_commit_4_year_old_girl_fixes_formatting_to/cmzfvpl/我们看看她修…

【娱乐】收录各种神奇知乎问答

1、有哪些算法或数据结构是ACM大牛们在比赛中创造出来的? 2、c有哪些像__gcd这样的编译器自带函数? 3、为什么尽量不要使用using namespace std? 4、经常用 LaTeX 的是些什么人? 转载于:https://www.cnblogs.com/zjp-shadow/p/722…

php文件上传后没有打开权限_记墨者靶机文件上传(二)

“ 声明:该公众号大部分文章来自日常学习笔记,若是转载会先得到原作者授权或其他公众号白名单,并附上链接。剑者,心之刃也。既可为杀,亦可为护。杀与护,不过一念之间!请勿利用文章内的相关技术从…

你还会写这段C51程序吗?

经典题目解析定时器T1采用计数模式,方式1中断,计数输入引脚 P3.5外接开关按钮作为计数信号输入,P1口控制8个LED小灯,初始状态所有小灯全亮,按3次按钮开关产生计数中断时,高3位和低5位交替闪烁3次&#xff0…

鸿蒙系统能不能用了,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼鸿蒙的厉害在于 你可能非用不可瀑布先生06-05 09:52科技达人关注华为一直在研发一套操作系统,如果不是对手打压。可能大部分人,至今都不知道这个系统的存在。如果市场稳定&#xff…

JDBC连接数据库(Java DataBase Connectivity,java)

通过JDBC操作数据库(以mysql为例) 1、官网下载JDBC的相关JAR包 【https://dev.mysql.com/downloads/connector/j/】 2、解压后,导入jar包 连接数据(引入外部jar包)项目上右键->build path->configure build path->上面Libraries->Add External JARs 3、…

python刘卫国实验题_MATLAB 程序设计与应用(刘卫国版)习题答案3-4

习题3:1.>> syms x f>>flimit((cos(sqrt(x)))^(pi/x),x,0,right)f exp(-1/2*pi)2.>> syms x f>>flimit((3*sin(x)x^2*cos(1/x))/((1cos(x))*log(1x)),x,0)f 3/23.>> syms x f>>flimit((sqrt(4*x^2x-1)x1)/sqrt(x^2sin(x)),x,-…

过年回家抢票攻略

每年过年抢票都是一个困难的事情,所以决定发一篇文章汇总一下各种抢票软件,大家自己有方案的可以在文章后面留言,让跟多的人看到,希望大家都能顺利抢到车票,顺利回家。超级抢票机,一款超强的火车票抢票神器…

[小技巧]diff的文件夹忽略使用方式

当我们比较两个文件夹时经常需要忽略.svn或者.git,那么如下 diff -r -x ".git" -x "*.ko" -x "*.o" -x "cscope*" -x "*.map" path1 path2 转载于:https://www.cnblogs.com/aaronLinux/p/7232505.html

python空列表添加_Python列表的简单操作

Python列表的简单操作:1. 在列表末尾添加元素:sth.append()2. 在列表中添加元素:sth.insert(位置,元素)3. 从列表中删除元素:1) del sth[元素位置] 2) pop的元素名 sth.pop(元素位置,不填则默认列表末尾)&…

C语言,函数不可返回指向栈内存的指针

预备知识:内存的分类C/C程序占用的内存分为两大类:静态存储区与动态存储区。其示意图如下所示:数据保存在静态存储区与动态存储区的区别就是:静态存储区在编译-链接阶段已经确定了,程序运行过程中不会变化,…

android 界面绘制完毕,几种获取android 界面性能数据的快捷方法

探测 界面绘制性能获取界面的绘制性能有很多种方法,比如说 Systrace 但是这种方法 有一个不太好的地方就是使用起来较为复杂, 有没有一种 谷歌官方推荐 的方便一点的方法 ,其实是有的,只需要一个函数 就可以获得layout的时间 非常…

联想rd650怎么装系统win7_Lenovo g50重装win7系统|U盘重装联想g50笔记本系统

Lenovo可以说是个家喻户晓的品牌很多小伙伴们也是使用联想的电脑,今天有小伙伴和小编提了一款Lenovo g50笔记本,小编了解到这款笔记本电脑的口碑和销量都很不错,其实这位小伙伴的问题呢是要如何重装win7系统,毕竟质量再好的电脑也…

书籍推荐

今天天气很好,风和日丽,艳阳高照,大家心情应该也很不错,毕竟,今天是周五,就像上学的时候一样,下午的铃声一响,每个同学都像脱缰的野马一样,周五,上班族的人们…

【转】JMeter学习(十三)分布式部署

Jmeter 是Java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力,j…

android mvp框架基类,Android MVP架构模式基类封装

前言MVP模式是Android官方推荐的架构模式,可使视图与数据层完全解耦。本文旨意封装在MVP模式中的基类如Activity,Fragment,Presenter类。以下内容建议在了解了mvp模式的读者阅读,如果还有对mvp架构模式有疑问的,请看我…

C语言,字符串指针做函数参数

看一下下面这段代码有什么问题?#include "stdio.h" //#include "stdbool.h" #include "string.h" #include "stdlib.h" #include "math.h"void getMemory(char *p) {/*char *p str*/p (char *)malloc(100);str…

java创建一个未知长度的数组_Java数组的创建操作

数组是一个固定长度的,包含了相同类型数据的 容器步骤1:声明数组步骤2:创建数组步骤3:访问数组步骤4:数组长度步骤5:练习-数组最小值步骤6:答案-数组最小值步骤 1 : 声明数组int[] a; 声明了一个数组变量。[]表示该变量是一个数组int 表示数组里的每一个元素都是一个…

Linux内核中的GPIO系统

一、前言作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务。对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver、LED driver。往往CPU datasheet的关于GPIO…

初识函数集锦

python之路——初识函数 阅读目录 为什么要用函数  函数的定义与调用  函数的返回值  函数的参数  本章小结为什么要用函数 现在有一个需求,让你计算hello world的长度,你怎么计算? s1hello world length0 for i in s1:length1 print…