相关知识了解
PhoneWindowManager.java 是供系统进程使用,是WindowManagerService 的一部分,WindowManagerService.java会利用PhoneWindowManager 决定一些策略来处理UI.
一般对于开发者来说,我们看的最多的是下面两个函数
// 用于处理一些特殊的按键
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags)
// 处理一般性的按键
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags)
实现双击home键切换到 recent app
文件:frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index cebf0a7..9ec5dbb 100755
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -842,6 +853,77 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private float mdeltax, mdeltay;
boolean keydown;
+ boolean homeDownDoubleClick = false;
+ long lastHomeDownTime=0;
+ long lastHomeUpTime=0;
@@ -6084,7 +6252,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
// Basic policy based on interactive state.
- int result;
+ int result = 0;
boolean isBox = "box".equals(SystemProperties.get("ro.target.product"));
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
@@ -6421,6 +6589,40 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (useHapticFeedback) {
performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false);
}
+ /**
+ * add by wutao 20190809
+ * Double-click the home button to switch to the recent app
+ */
+ if(keyCode == KeyEvent.KEYCODE_HOME){
+ if(down){
+ // this is home down
+ if(((event.getEventTime() - lastHomeDownTime) < 500)){
+ homeDownDoubleClick = true;
+ }else{
+ homeDownDoubleClick = false;
+ }
+ lastHomeDownTime = event.getEventTime();
+ } else {
+ // then home up comes
+ Log.d(TAG,"homeDownDoubleClick="+homeDownDoubleClick+",lastHomeDownTime="+lastHomeDownTime+",lastHomeUpTime="+lastHomeUpTime+",this home up="+event.getEventTime());
+ if(homeDownDoubleClick && ((event.getEventTime() - lastHomeUpTime) < 500)){
+ Log.d(TAG,"double click on home detected");
+ try {
+ StatusBarManagerInternal statusbar = getStatusBarManagerInternal();
+ if (statusbar != null) {
+ statusbar.preloadRecentApps();
+ statusbar.toggleRecentApps();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ mStatusBarService = null;
+ }
+ //result |= ACTION_WAKE_UP;
+ return result;
+ }
+ lastHomeUpTime = event.getEventTime();
+ }
+ }
if (isWakeKey) {
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
参考:
https://blog.youkuaiyun.com/Evahuangchen/article/details/48294057