Android按键唤醒原理

系统默认的唤醒按键值

http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {

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


        int result;
        boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
                || event.isWakeKey();
        if (interactive || (isInjected && !isWakeKey)) {
         
        } else if (!interactive && shouldDispatchInputWhenNonInteractive(event)) {
           
        } else {
            // When the screen is off and the key is not injected, determine whether
            // to wake the device but don't pass the key to the application.
            result = 0;
            if (isWakeKey && (!down || !isWakeKeyWhenScreenOff(keyCode))) {
                isWakeKey = false;
            }
            // Cache the wake key on down event so we can also avoid sending the up event to the app
            if (isWakeKey && down) {
                mPendingWakeKey = keyCode;
            }
        }

        if (isValidGlobalKey(keyCode)&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
            if (isWakeKey) {
                wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
            }
            return result;
        }
}
    private boolean isWakeKeyWhenScreenOff(int keyCode) {
        switch (keyCode) {
            // ignore volume keys unless docked
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_DOWN:
            case KeyEvent.KEYCODE_VOLUME_MUTE:
                return mDockMode != Intent.EXTRA_DOCK_STATE_UNDOCKED;

            // ignore media and camera keys
            case KeyEvent.KEYCODE_MUTE:
            case KeyEvent.KEYCODE_HEADSETHOOK:
            case KeyEvent.KEYCODE_MEDIA_PLAY:
            case KeyEvent.KEYCODE_MEDIA_PAUSE:
            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
            case KeyEvent.KEYCODE_MEDIA_STOP:
            case KeyEvent.KEYCODE_MEDIA_NEXT:
            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
            case KeyEvent.KEYCODE_MEDIA_REWIND:
            case KeyEvent.KEYCODE_MEDIA_RECORD:
            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
            case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
            case KeyEvent.KEYCODE_CAMERA:
                return false;
        }
        return true;
    }

http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/view/KeyEvent.java

public static final int KEYCODE_BACK            = 4;
public static final int KEYCODE_MENU            = 82;
public static final int KEYCODE_WAKEUP          = 224;
public static final int KEYCODE_STEM_1 		= 265;
public static final int KEYCODE_STEM_2 		= 266;
public static final int KEYCODE_STEM_3 		= 267;
public static final int KEYCODE_PAIRING         = 225;
public final boolean isWakeKey() {
	return isWakeKey(mKeyCode);
}
 public static final boolean isWakeKey(int keyCode) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
            case KeyEvent.KEYCODE_MENU:
            case KeyEvent.KEYCODE_WAKEUP:
            case KeyEvent.KEYCODE_PAIRING:
            case KeyEvent.KEYCODE_STEM_1:
            case KeyEvent.KEYCODE_STEM_2:
            case KeyEvent.KEYCODE_STEM_3:
                return true;
        }
}

那驱动层应该汇报何种键值才能唤醒系统呢。

framework键值重定义

驱动层按键值

http://androidxref.com/kernel_3.18/xref/include/uapi/linux/input.h

#define KEY_SLEEP         142    /* SC System Sleep */
#define KEY_WAKEUP        143    /* System Wake Up */

framework按键值功能定义

http://androidxref.com/9.0.0_r3/xref/frameworks/base/data/keyboards/Generic.kl

key    142      SLEEP
key    143      WAKEUP

http://androidxref.com/9.0.0_r3/xref/frameworks/native/include/input/InputEventLabels.h

#将字符加上双引号
##连接字符串
#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }
struct InputEventLabel {
	const char *literal;
	int value;
};

static const InputEventLabel KEYCODES[] = {
...
DEFINE_KEYCODE(SLEEP),
DEFINE_KEYCODE(WAKEUP),
...
}

DEFINE_KEYCODE(SLEEP)就变成了{"SLEEP",AKEYCODE_SLEEP}

http://androidxref.com/9.0.0_r3/xref/frameworks/native/include/android/keycodes.h

AKEYCODE_SLEEP           = 223,
AKEYCODE_WAKEUP          = 224,

http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/view/KeyEvent.java 

public static final int KEYCODE_SLEEP           = 223;
public static final int KEYCODE_WAKEUP          = 224;

也就是驱动层的142跟framework层的223对应。

所以驱动层可以汇报已有能唤醒系统的键值,或者修改isWakeKey函数。

在Android5.0之前,可以在相应的kl文件加入WAKE或WAKE_DROPPED参数,如

http://androidxref.com/4.4.4_r1/xref/frameworks/base/data/keyboards/Generic.kl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值