Android中Home键的监听和拦截示例
首先大家应该先了解一种情况,就是Android在应用中是无法拦截Home键的,今天我们带大家看一下Home键的三种情况。
1、在应用中按下Home键的逻辑处理
当我们在应用中按下Home键时界面会启动到桌面,我们在frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.Java类中可以看到其实现原理,其不外乎就是调用了以下代码。
IntentmHomeIntent; mHomeIntent=newIntent(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键可以使用广播机制,这个在源码中也有体现。
staticpublicfinalStringSYSTEM_DIALOG_REASON_KEY="reason"; staticpublicfinalStringSYSTEM_DIALOG_REASON_GLOBAL_ACTIONS="globalactions"; staticpublicfinalStringSYSTEM_DIALOG_REASON_RECENT_APPS="recentapps"; staticpublicfinalStringSYSTEM_DIALOG_REASON_HOME_KEY="homekey"; staticpublicfinalStringSYSTEM_DIALOG_REASON_ASSIST="assist"; @Override publicvoidonReceive(Contextarg0,Intentarg1){ Stringaction=arg1.getAction(); //按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播 if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){ Stringreason=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(); }elseif(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()方法。
publiclonginterceptKeyBeforeDispatching(WindowStatewin,KeyEventevent,intpolicyFlags){ //...... if(keyCode==KeyEvent.KEYCODE_HOME){ //...... handleShortPressOnHome(); } } //进入handleShortPressOnHome privatevoidhandleShortPressOnHome(){ //Ifthere'sadreamrunningthenusehometoescapethedream //butdon'tactuallygohome. if(mDreamManagerInternal!=null&&mDreamManagerInternal.isDreaming()){ mDreamManagerInternal.stopDream(false/*immediate*/); return; } //Gohome! launchHomeFromHotKey(); }
进入launchHomeFromHotKey方法。
staticpublicfinalStringSYSTEM_DIALOG_REASON_KEY="reason"; staticpublicfinalStringSYSTEM_DIALOG_REASON_GLOBAL_ACTIONS="globalactions"; staticpublicfinalStringSYSTEM_DIALOG_REASON_RECENT_APPS="recentapps"; staticpublicfinalStringSYSTEM_DIALOG_REASON_HOME_KEY="homekey"; staticpublicfinalStringSYSTEM_DIALOG_REASON_ASSIST="assist"; voidlaunchHomeFromHotKey(){ if(isKeyguardShowingAndNotOccluded()){ //don'tlaunchhomeifkeyguardshowing }elseif(!mHideLockScreen&&mKeyguardDelegate.isInputRestricted()){ //wheninkeyguardrestrictedmode,mustfirstverifyunlock //beforelaunchinghome mKeyguardDelegate.verifyUnlock(newOnKeyguardExitResult(){ @Override publicvoidonKeyguardExitResult(booleansuccess){ if(success){ try{ ActivityManagerNative.getDefault().stopAppSwitches(); }catch(RemoteExceptione){ } sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); startDockOrHome(); } } }); }else{ //nokeyguardstufftoworryabout,justlaunchhome! try{ ActivityManagerNative.getDefault().stopAppSwitches(); }catch(RemoteExceptione){ } if(mRecentsVisible){ //HideRecentsandnotifyittolaunchHome awakenDreams(); sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); hideRecentApps(false,true); }else{ //Otherwise,justlaunchHome sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY); //启动Launcher界面 startDockOrHome(); } } }
以上方法可处理Home键的拦截操作,接下来我们进入startDockOrHome方法。
voidstartDockOrHome(){ if(OptConfig.LC_RAM_SUPPORT){ try{ ActivityManagerNative.getDefault().startHomePre(); }catch(RemoteExceptionre){ } } awakenDreams(); Intentdock=createHomeDockIntent(); if(dock!=null){ try{ startActivityAsUser(dock,UserHandle.CURRENT); return; }catch(ActivityNotFoundExceptione){ } } //intent的相关设置 mHomeIntent=newIntent(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键进行简单的监听和拦截。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。