power按鍵一般在framework層直接處理,app是無法監聽到power key的,
若按鍵測試需要測試power鍵,需在framework層添加過濾,
參考代碼如下:
1.增加方法
private boolean isPowerKeyTestActivity()
{
ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
String topActivityPackageName = taskInfo.get(0).topActivity.getPackageName();
String topActivityClassName = taskInfo.get(0).topActivity.getClassName();
if (DEBUG) {
Log.d(TAG, "isPowerKeyTestActivity Current PackageName ::" + topActivityPackageName);
Log.d(TAG, "isPowerKeyTestActivity Current ClassName ::" + topActivityClassName);
}
if (topActivityClassName.equals("com.example.myapplication.PowerKeyTest"))
{
return true;
}
return false;
}
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
2.修改 phoneWindowManager.java 的 interceptKeyBeforeQueueing 方法 中找到分支KEYCODE_POWER分支,
若是目前是按鍵測試界面則不處理powerkey,這樣app層就可以拿到power key
case KeyEvent.KEYCODE_POWER: {
// Any activity on the power button stops the accessibility shortcut
cancelPendingAccessibilityShortcutAction();
result &= ~ACTION_PASS_TO_USER;
//add start,else 語句裏面的是原有的代碼
if(isMmiKeyTestActivity()){
result |= ACTION_PASS_TO_USER;
}else{
isWakeKey = false; // wake-up will be handled separately
if (down) {
interceptPowerKeyDown(event, interactive);
} else {
interceptPowerKeyUp(event, interactive, canceled);
}
}
break;
}