目录
需求原理添加消息逻辑添加按键处理调用按键处理需求
设备有一个按键,我们定义为了>
原理
在>
添加消息逻辑
首先定义一个属于自己的消息,可以看到,在>private static final int MSG_XXXX = XX;,我们需要在最后这里添加一个自己的 private static final int MSG_MY_REBOOT = 999; 定义为999是为了避免与现有值重复。 接下来,在 handleMessage 方法中,添加该消息的处理:
private class PolicyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_ENABLE_POINTER_LOCATION:
enablePointerLocation();
break;
// Add start
case MSG_MY_REBOOT:
mWindowManagerFuncs.reboot(false);
break;
// Add end ...
// 省略若干行
}
}
}
这里直接调用了 mWindowManagerFuncs 的 reboot 方法,传 false 进去,表现为不弹窗直接进入重启过程,显示“系统重启中”页面。传 true 进去,则弹窗提示将要关机,点是关机重启、点否取消。
添加按键处理
首先定义两个函数,分别进行>interceptXxxKeyDown 方法,写到与他们并列的位置即可。
// .....
// Add start
private void interceptCenterKeyDown() {
Message msg = mHandler.obtainMessage(MSG_MY_REBOOT);
msg.setAsynchronous(true);
mHandler.sendMessageDelay(msg, 5000); // 5000ms = 5seconds
}
private void interceptCenterKeyUp() {
mHandler.removeMessages(MSG_MY_REBOOT);
}
// Add end
private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
// 省略若干行
调用按键处理
最后,在>interceptKeyBeforeQueueing 中添加对按键的拦截及处理调用
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
if (!mSystemBooted) {
// If we have not yet booted, don't let key events do anything
return 0;
}
final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0;
// 省略若干行
switch (keyCode) {
case KeyEvent.KEYCODE_BACK: {
if (down) {
interceptBackKeyDown();
} else {
boolean handled = interceptBackKeyUp(event);
// Don't pass back press to app if we've already handled it via long press
if (handled) {
result &= ~ACTION_PASS_TO_USER;
}
}
break;
}
// Add start
case KeyEvent.KEYCODE_DPAD_CENTER: {
if (down) {
interceptCenterKeyDown();
} else {
interceptCenterKeyUp();
}
break;
}
// Add end
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
// 省略若干行
}
}
这里,因为在一般情况下,我们需要把这个按键消息发送给应用层,因此这里我们不进行 result &= ~ACTION_PASS_TO_USER 的操作。
这样,整个长按重启功能就实现了。
更多关于Android CENTER键长按功能的资料请关注易采站长站其它相关文章!










