android 按键,Android 7.0 Power 按键处理流程

本文详细介绍了Android 7.0中Power按键的处理流程,从按键的上报到具体的业务逻辑处理,包括按下和抬起两个阶段。在按下时,会检查是否需要截图、静音或挂断电话,并可能触发长按行为。抬起时,根据屏幕状态和配置决定是否执行熄屏操作。整个流程涉及到PhoneWindowManager、InputReader和PowerManagerService等多个组件的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 7.0  Power 按键处理流程

Power按键的处理逻辑由PhoneWindowManager来完成,本文只关注PhoneWindowManager中与Power键相关的内容,其他系统按键的处理类似也是在PhoneWindowManager中处理的。理解了power按键的处理再看其他系统按键的逻辑会容易的多也简单的多。

一、Power按键的上报

Power按键的上报流程与其余的按键处理流程一致,在按下power按键后驱动上报按键经InputManagerService处理按键事件,最终将会传递到PhoneWindowManager的interceptKeyBeforeQueueing函数来做具体的业务逻辑。(具体处理 Input system 做详细介绍)本篇侧重power的业务逻辑处理,这里简单介绍下power 按键的上报流程如下图:

144e0bf1b91a45f6d3764aacf1060e1b.png

1-4:在power 按键按下时驱动会上报按键事件,EventHub读取到事件后转给InputReader来做处理。

5-9:InputReader根据上报的事件类型(此处是按键事件),交给KeyBoardInputMapper来做按键映射,根据驱动上报的按键值来映射为android framework的按键值(即KeyEvent.KEYCODE_POWER 和相应的flag),并通知上层。

10-16:经过层调用最后到PhoneWindowManager的interceptKeyBeforeQueueing()函数来做具体的业务处理。这是本文的重点,下面具体分析。

17-18:通过PowerManagerService来唤醒系统。

二、Power 按键处理

PhoneWindowManager的interceptKeyBeforeQueueing()函数处理具体的业务逻辑,从这个函数开始进行分析。

按键的事件分为按下和抬起两个,framework的处理也是分为按下和抬起来不同的事件分别由不同的函数来处理。

public int interceptKeyBeforeQueueing(KeyEvent event, intpolicyFlags) {if (!mSystemBooted) {//If we have not yet booted, don‘t let key events do anything.

return 0;

}//是否点亮屏幕

final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0;

final boolean down= event.getAction() ==KeyEvent.ACTION_DOWN;

final boolean canceled= event.isCanceled();//获取按键对应的android framework层的按键编码

final int keyCode = event.getKeyCode();

.................switch(keyCode) {

...........caseKeyEvent.KEYCODE_POWER: {

result&= ~ACTION_PASS_TO_USER;

isWakeKey= false; //wake-up will be handled separately

if(down) {//处理Power键按下

interceptPowerKeyDown(event, interactive);

}else{//处理Power键松开

interceptPowerKeyUp(event, interactive, canceled);

}break;

}

}

..............if(isWakeKey) {//按power键时,isWakeKey置为false,于是不会调用wakeUp函数,即不会唤醒系统点亮屏幕

wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");

}returnresult;

}

扩展:由上可知 isWakeKey 用来控制是否唤醒系统并点亮屏幕,如果需要添加按键需要实现点亮屏幕功能,可以在此处理 ^_^。

接下来,我们分别看一下interceptPowerKeyDown和interceptPowerKeyUp函数。

1、Power按键按下(interceptPowerKeyDown)

interceptPowerKeyDown()用于处理按下Power键(还未抬起)对应的事件。

A: Power按键按下处理时序图

7d3088da20bbe399169c36bbb5036dc6.png

处理流程:

1)  判断是否power按键与音量按键“同时”按下需要做截屏动作,是则触发截屏。

2)  是否为响铃或通话状态,是则执行与之相关配置的动作(默认响铃会静音,如果设置按power挂断电话则挂断)。

3)  判断是否为长按,是则根据配置执行长按行为的动作。

B: 代码分析

private void interceptPowerKeyDown(KeyEvent event, boolean intera

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值