首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下Home键的三种情况。
1、在应用中按下Home键的逻辑处理
当我们在应用中按下Home键时界面会启动到桌面,我们在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.Java类中可以看到其实现原理,其不外乎就是调用了以下代码。
Intent mHomeIntent; mHomeIntent = new Intent(Intent.ACTION_MAIN, null); mHomeIntent.addCategory(Intent.CATEGORY_HOME); mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); startActivity(mHomeIntent);
创建一个启动到桌面的Intent。
2、在应用中监听Home键
在Android应用中如果想监听Home键可以使用广播机制,这个在源码中也有体现。
static public final String SYSTEM_DIALOG_REASON_KEY = "reason"; static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist"; @Override public void onReceive(Context arg0, Intent arg1) { String action = arg1.getAction(); //按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播 if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = arg1.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (reason != null) { if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { // 短按home键 Toast.makeText(arg0, "短按Home键", Toast.LENGTH_SHORT).show(); } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { // RECENT_APPS键 Toast.makeText(arg0, "RECENT_APPS", Toast.LENGTH_SHORT).show(); } } } }
这样就可以监听Home的是否被按下。
3、在Frameworks层拦截Home键
在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java文件中我们首先看一下interceptKeyBeforeDispatching()方法。
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) { //...... if (keyCode == KeyEvent.KEYCODE_HOME) { //...... handleShortPressOnHome(); } } //进入handleShortPressOnHome private void handleShortPressOnHome() { // If there's a dream running then use home to escape the dream // but don't actually go home. if (mDreamManagerInternal != null && mDreamManagerInternal.isDreaming()) { mDreamManagerInternal.stopDream(false /*immediate*/); return; } // Go home! launchHomeFromHotKey(); }
进入launchHomeFromHotKey方法。
static public final String SYSTEM_DIALOG_REASON_KEY = "reason"; static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist"; void launchHomeFromHotKey() { if (isKeyguardShowingAndNotOccluded()) { // don't launch home if keyguard showing } else if (!mHideLockScreen && mKeyguardDelegate.isInputRestricted()) { // when in keyguard restricted mode, must first verify unlock // before launching home mKeyguardDelegate.verifyUnlock(new OnKeyguardExitResult() { @Override public void onKeyguardExitResult(boolean success) { if (success) { try { ActivityManagerNative.getDefault().stopAppSwitches(); } catch (RemoteException e) { } sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); startDockOrHome(); } } }); } else { // no keyguard stuff to worry about, just launch home! try { ActivityManagerNative.getDefault().stopAppSwitches(); } catch (RemoteException e) { } if (mRecentsVisible) { // Hide Recents and notify it to launch Home awakenDreams(); sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); hideRecentApps(false, true); } else { // Otherwise, just launch Home sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); //启动Launcher界面 startDockOrHome(); } } }
以上方法可处理Home键的拦截操作,接下来我们进入startDockOrHome方法。
void startDockOrHome() { if (OptConfig.LC_RAM_SUPPORT) { try { ActivityManagerNative.getDefault().startHomePre(); } catch (RemoteException re) { } } awakenDreams(); Intent dock = createHomeDockIntent(); if (dock != null) { try { startActivityAsUser(dock, UserHandle.CURRENT); return; } catch (ActivityNotFoundException e) { } } //intent的相关设置 mHomeIntent = new Intent(Intent.ACTION_MAIN, null); mHomeIntent.addCategory(Intent.CATEGORY_HOME); mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); startActivityAsUser(mHomeIntent, UserHandle.CURRENT); }
好啦,这里就对Home键进行简单的监听和拦截。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android中监听Home键的4种方法总结,包括了Android中监听Home键的4种方法总结的使用技巧和注意事项,需要的朋友参考一下 昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。 看了一下网上的资料,说下面的
本文向大家介绍Android 解决监听home键的几种方法,包括了Android 解决监听home键的几种方法的使用技巧和注意事项,需要的朋友参考一下 Android 解决监听home键的几种方法 前言: 以下两种方法可以完美解决监听back键,home键,多任务键(最近任务键)。 一、使用注册广播监听home键、多任务键 演示图 创建一个广播代码如下: 在Activity中的onCreate()
主要内容:1.maven仓库,2.过滤器,3.拦截器,4.监听器,5.实例化,6.测试,7.拦截器与过滤器的区别1.maven仓库 2.过滤器 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术。 如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 Session 校验,判断用户权限,如果不符合设定条件,则会被拦截到特殊的地址或者基于特殊的响应。 3.拦截器 Java中的拦截器是动态拦截 action 调用的
本文向大家介绍浅析JAVA中过滤器、监听器、拦截器的区别,包括了浅析JAVA中过滤器、监听器、拦截器的区别的使用技巧和注意事项,需要的朋友参考一下 1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login
本文向大家介绍Android 屏蔽和捕获Home键的示例代码,包括了Android 屏蔽和捕获Home键的示例代码的使用技巧和注意事项,需要的朋友参考一下 在Level5以上(包含)中,Activity类中的方法:public void onAttachedToWindow ()就能对Home键进行捕获。 具体代码如下: MainActivity.java 当我们点击Home键的时候,程序并没有