RK3326 Android 8.1 实现双击home键切换到 recent app

本文详细解析了在Android系统中如何通过修改PhoneWindowManager.java文件实现双击Home键快速切换至最近应用程序的功能。文章深入探讨了PhoneWindowManager在处理按键事件中的作用,并展示了具体的代码修改细节。

相关知识了解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值