Android中监听Home键的4种方法总结
昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。
看了一下网上的资料,说下面的方法可以。(其实不行)
@Override publicvoidonAttachedToWindow(){ //TODOAuto-generatedmethodstub Log.d("aeon","onAttachedToWindow"); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); }
加了权限之后也不行。
<uses-permissionandroid:name="android.permission.DISABLE_KEYGUARD"> </uses-permission>
实验几次之后(android4.1和android4.2)发现在单个的activity里面有以下几个方法可以使用:
方法1:onSaveInstanceState方法
下面这个方法可以处理home的监听问题。
protectedvoidonSaveInstanceState(BundleoutState)
但这个方法不是很好,不推荐
方法2:onUserLeaveHint方法
@Override protectedvoidonUserLeaveHint(){ Log.d("aeon","onUserLeaveHint"); super.onUserLeaveHint(); }
这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。
方法3:ACTION_CLOSE_SYSTEM_DIALOGS
在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS
//注册Receiver HomeKeyEventBroadCastReceiverreceiver=newHomeKeyEventBroadCastReceiver(); registerReceiver(receiver,newIntentFilter( Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
方法4:frameworkPhoneWindowManager.java处理
想要完全监听home键需要在framework层去处理。
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
里面去修改privatevoidhandleLongPressOnHome()这个方法。
privatevoidhandleLongPressOnHome(){ //Wecan'tinitializethisininit()sincetheconfigurationhasn'tbeenloadedyet. if(mLongPressOnHomeBehavior<0){ mLongPressOnHomeBehavior =mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior); if(mLongPressOnHomeBehavior<LONG_PRESS_HOME_NOTHING|| mLongPressOnHomeBehavior>LONG_PRESS_HOME_RECENT_SYSTEM_UI){ mLongPressOnHomeBehavior=LONG_PRESS_HOME_NOTHING; } } if(mLongPressOnHomeBehavior!=LONG_PRESS_HOME_NOTHING){ performHapticFeedbackLw(null,HapticFeedbackConstants.LONG_PRESS,false); sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS); //Eatthelongpresssoitwon'tdismisstherecentappsdialogwhen //theuserletsgoofthehomekey mHomeLongPressed=true; } if(mLongPressOnHomeBehavior==LONG_PRESS_HOME_RECENT_DIALOG){ showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS); }elseif(mLongPressOnHomeBehavior==LONG_PRESS_HOME_RECENT_SYSTEM_UI){ try{ IStatusBarServicestatusbar=getStatusBarService(); if(statusbar!=null){ statusbar.toggleRecentApps(); } }catch(RemoteExceptione){ Slog.e(TAG,"RemoteExceptionwhenshowingrecentapps",e); //re-acquirestatusbarservicenexttimeitisneeded. mStatusBarService=null; } } }
只要把handleLongPressOnHome里面做出相对应的处理就ok