android7.0 电源(Power)键流程

 对于Power键的分析文章较多,本文从android7.0源码的角度大致分析下电源键的流程!参考博主连接:http://blog.csdn.net/gaugamela/article/details/52912382 和http://blog.csdn.net/kc58236582/article/details/51568506!

一 android 按键事件简介

    在android系统中,每一个App所呈现的UI都是一个Activity,而UI的呈现实际上则是由Window对象来实现的,每个Window对象实际上又是PhoneWindow对象;而每个PhonewWindow对象又是一个PhoneWindowManager(PWM)对象。在将按键处理操作分发到App之前,首选会回调PWM中的dispatchUnhandledKey()方法,该方法主要是用于在执行当前App处理之前的操作,处理一些特殊按键。

   PWM中有两个对按键比较重要的函数(按键预处理,针对特殊按键,如Power):intercepetKeyBeforeDispatching()和intercepetKeyBeforeQueueing()。

   intercepetKeyBeforeQueueing()主要是用来处理音量和电源键,该函数中有一个重要的变量ACTION_PASS_TO_USER(变量解释:传递按键事件到用户app进行处理),该函数的返回值如果是0则表示该按键事件被消费,按键事件不会传递到用户App,返回1则表示允许按键事件传递给用户App中进行处理。

   intercepetKeyBeforeDispatching()主要是用来预处理home、menu、search按键事件;该函数的返回值如果是-1则表示的是该按键事件被消费,返回0则代表允许事件的往下传递。这些处理的实现都是在PWM,其调用者是InputDispatchThread,这样处理的好处就是把平台相关的东西都放置在PWM中,而InputDispatchThread则是平台通用的,厂商要定制特殊策略只需要更改PWM,这样就很好的做到了Mechanism和Policy的分离。

二 PWM函数解析

@Override
public KeyEventdispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) {
KeyEvent fallbackEvent = null;
//下面的逻辑主要是用于判断按键事件是否被消费;因为同一时刻可能有两个按键事件同时触发,如组合键(Power+音量下键实现截屏),则必须判断该逻辑表明一个按键还未消费
if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {//按键标识符
final KeyCharacterMap kcm = event.getKeyCharacterMap(); //获得键盘映射----字符映射KeyCharacterMap
final int keyCode = event.getKeyCode(); //按键码
final int metaState = event.getMetaState();//获取功能键状态;如果没有功能键(如alt、shift)按下,则metaState为0
final boolean initialDown = event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0; //首次按键
// Check for fallback actions specified by the key character map.
final FallbackAction fallbackAction; //不太懂
if (initialDown) {
fallbackAction = kcm.getFallbackAction(keyCode, metaState);
} else {
fallbackAction = mFallbackActions.get(keyCode);
}
if (fallbackAction != null) {
final int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK;
fallbackEvent = KeyEvent.obtain(
event.getDownTime(), event.getEventTime(),
event.getAction(), fallbackAction.keyCode,
event.getRepeatCount(), fallbackAction.metaState,
event.getDeviceId(), event.getScanCode(),
flags, event.getSource(), null); //按键事件
if (!interceptFallback(win, fallbackEvent, policyFlags)) {
fallbackEvent.recycle();
fallbackEvent = null;
}
if (initialDown) {
mFallbackActions.put(keyCode, fallbackAction);
} else if (event.getAction() == KeyEvent.ACTION_UP) {
mFallbackActions.remove(keyCode);
fallbackAction.recycle();
}
}
}
return fallbackEvent;
}
   其中最主要分析以下的代码
private boolean interceptFallback(WindowState win, KeyEvent fallbackEvent, int policyFlags) {
int actions =interceptKeyBeforeQueueing(fallbackEvent, policyFlags);
if ((actions & ACTION_PASS_TO_USER) != 0) {
long delayMillis =interceptKeyBeforeDispatching(
win, fallbackEvent, policyFlags);
if (delayMillis == 0) {
return true;
}
}
return false;
}

三 电源键(Power)函数分析

在interceptKeyBeforeQueueing函数中对于电源键的处理部分代码如下:
case KeyEvent.KEYCODE_POWER: {
result &= ~ACTION_PASS_TO_USER;
isWakeKey = false; // wake-up will be handled separately
if (down) {
interceptPowerKeyDown(event, interactive); //power键按下
} else {
in
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值