http://862123204-qq-com.iteye.com/blog/1888532
昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。
看了一下网上的资料,说下面的方法可以。(其实不行)
- @Override
- public void onAttachedToWindow() {
- // TODO Auto-generated method stub
- Log.d("aeon","onAttachedToWindow");
- this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
- super.onAttachedToWindow();
- }
加了权限之后也不行。
实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:
方法1:onSaveInstanceState方法
下面这个方法可以处理home的监听问题。
但这个方法不是很好,不推荐
方法2:onUserLeaveHint方法
- @Override
- protected void onUserLeaveHint() {
- Log.d("aeon","onUserLeaveHint");
- super.onUserLeaveHint();
- }
这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。
方法3:ACTION_CLOSE_SYSTEM_DIALOGS
在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS
- //注册Receiver
- HomeKeyEventBroadCastReceiver receiver = new HomeKeyEventBroadCastReceiver();
- registerReceiver(receiver, new IntentFilter(
- Intent. ACTION_CLOSE_SYSTEM_DIALOGS));
方法4:framework PhoneWindowManager.java 处理
想要完全监听home键需要在framework层去处理。
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
里面去修改private void handleLongPressOnHome() 这个方法。
- private void handleLongPressOnHome() {
- // We can't initialize this in init() since the configuration hasn't been loaded yet.
- 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);
- // Eat the longpress so it won't dismiss the recent apps dialog when
- // the user lets go of the home key
- mHomeLongPressed = true;
- }
- if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {
- showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);
- } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {
- try {
- IStatusBarService statusbar = getStatusBarService();
- if (statusbar != null) {
- statusbar.toggleRecentApps();
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "RemoteException when showing recent apps", e);
- // re-acquire status bar service next time it is needed.
- mStatusBarService = null;
- }
- }
- }
只要把handleLongPressOnHome里面做出相对应的处理就ok