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键进行简单的监听和拦截。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。