Android处理Home键方法小结


http://862123204-qq-com.iteye.com/blog/1888532


昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以处理菜单键和back键,但home不能。因为home键是系统键,情况特殊一些。

看了一下网上的资料,说下面的方法可以。(其实不行)

Java代码   收藏代码
  1. @Override  
  2.    public void onAttachedToWindow() {  
  3.        // TODO Auto-generated method stub  
  4.        Log.d("aeon","onAttachedToWindow");  
  5.        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   
  6.        super.onAttachedToWindow();  
  7.    }  

加了权限之后也不行。

Xml代码   收藏代码
  1. <uses-permission android:name="android.permission.DISABLE_KEYGUARD" >  
  2.    </uses-permission>  

  

 

实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:

 

方法1:onSaveInstanceState方法

  下面这个方法可以处理home的监听问题。

Java代码   收藏代码
  1. protected void onSaveInstanceState(Bundle outState)  

  但这个方法不是很好,不推荐

 

 

方法2:onUserLeaveHint方法

 

Java代码   收藏代码
  1. @Override  
  2.     protected void onUserLeaveHint() {  
  3.         Log.d("aeon","onUserLeaveHint");  
  4.         super.onUserLeaveHint();  
  5.     }  

  

这个方法会在onSaveInstanceState之前执行,根据api的解释,这个方法还比较合适的。

 

方法3:ACTION_CLOSE_SYSTEM_DIALOGS

 

在使用广播监听方面可以使用ACTION_CLOSE_SYSTEM_DIALOGS

 

 

Java代码   收藏代码
  1. //注册Receiver  
  2.    
  3.               HomeKeyEventBroadCastReceiver receiver = new HomeKeyEventBroadCastReceiver();  
  4.              registerReceiver(receiver, new IntentFilter(  
  5.                            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() 这个方法。

 

Java代码   收藏代码
  1. private void handleLongPressOnHome() {  
  2.         // We can't initialize this in init() since the configuration hasn't been loaded yet.  
  3.         if (mLongPressOnHomeBehavior < 0) {  
  4.             mLongPressOnHomeBehavior  
  5.                     = mContext.getResources().getInteger(R.integer.config_longPressOnHomeBehavior);  
  6.             if (mLongPressOnHomeBehavior < LONG_PRESS_HOME_NOTHING ||  
  7.                     mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) {  
  8.                 mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING;  
  9.             }  
  10.         }  
  11.   
  12.         if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) {  
  13.             performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);  
  14.             sendCloseSystemWindows(SYSTEM_DIALOG_REASON_RECENT_APPS);  
  15.   
  16.             // Eat the longpress so it won't dismiss the recent apps dialog when  
  17.             // the user lets go of the home key  
  18.             mHomeLongPressed = true;  
  19.         }  
  20.   
  21.         if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) {  
  22.             showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS);  
  23.         } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) {  
  24.             try {  
  25.                 IStatusBarService statusbar = getStatusBarService();  
  26.                 if (statusbar != null) {  
  27.                     statusbar.toggleRecentApps();  
  28.                 }  
  29.             } catch (RemoteException e) {  
  30.                 Slog.e(TAG, "RemoteException when showing recent apps", e);  
  31.                 // re-acquire status bar service next time it is needed.  
  32.                 mStatusBarService = null;  
  33.             }  
  34.         }  
  35.     }  

  只要把handleLongPressOnHome里面做出相对应的处理就ok


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值