Android 7.0 Power 按键处理流程
Power按键的处理逻辑由PhoneWindowManager来完成,本文只关注PhoneWindowManager中与Power键相关的内容,其他系统按键的处理类似也是在PhoneWindowManager中处理的。理解了power按键的处理再看其他系统按键的逻辑会容易的多也简单的多。
一、Power按键的上报
Power按键的上报流程与其余的按键处理流程一致,在按下power按键后驱动上报按键经InputManagerService处理按键事件,最终将会传递到PhoneWindowManager的interceptKeyBeforeQueueing函数来做具体的业务逻辑。(具体处理 Input system 做详细介绍)本篇侧重power的业务逻辑处理,这里简单介绍下power 按键的上报流程如下图:
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按键按下处理时序图
处理流程:
1) 判断是否power按键与音量按键“同时”按下需要做截屏动作,是则触发截屏。
2) 是否为响铃或通话状态,是则执行与之相关配置的动作(默认响铃会静音,如果设置按power挂断电话则挂断)。
3) 判断是否为长按,是则根据配置执行长按行为的动作。
B: 代码分析
private void interceptPowerKeyDown(KeyEvent event, boolean intera