Android中监听Home键的4种方法总结

来源:互联网 发布:linux smp lock.h 编辑:程序博客网 时间:2024/06/07 00:15

http://www.jb51.net/article/64779.htm

这篇文章主要介绍了Android中监听Home键的4种方法总结,本文讲解了onSaveInstanceState方法、onUserLeaveHint方法、ACTION_CLOSE_SYSTEM_DIALOGS、framework PhoneWindowManager.java等4种方法,需要的朋友可以参考下
<iframe id="cproIframe_u2261530_2" width="680" height="200" src="http://pos.baidu.com/acom?adn=3&amp;adp=1&amp;at=0&amp;aurl=&amp;c01=1&amp;cad=1&amp;ccd=24&amp;cec=GBK&amp;cfv=17&amp;ch=0&amp;col=en-US&amp;conBW=1&amp;conOP=1&amp;cpa=1&amp;cpro_lu=1%2C%23dfe4f9%2C%23000000%2C%E5%AE%8B%E4%BD%93&amp;dai=2&amp;dis=0&amp;layout_filter=image&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DK_w5knVGT0OVvo9bXPtqR-Q8Kdh6VAKVxlI3WeAGV8NBc8A6WD4kZ2RmMBjvb1LV%26wd%3D%26eqid%3Db1bf98e5000155a20000000356667a8f&amp;ltu=http%3A%2F%2Fwww.jb51.net%2Farticle%2F64779.htm&amp;lu_161=0&amp;lunum=6&amp;n=jb51_cpr&amp;pat=6&amp;pcs=1855x969&amp;pih=0&amp;pis=10000x10000&amp;piw=0&amp;ps=535x432&amp;psr=1920x1080&amp;pss=1855x541&amp;ptbg=90&amp;ptp=0&amp;ptt=0&amp;qn=4c6003fba3184946&amp;rad=&amp;rsi0=680&amp;rsi1=200&amp;rsi5=4&amp;rss0=%23FFFFFF&amp;rss1=%23FFFFFF&amp;rss2=%23000000&amp;rss3=%23444444&amp;rss4=%23008000&amp;rss5=&amp;rss6=%23e10900&amp;rss7=&amp;scale=&amp;skin=tabcloud_skin_5&amp;stid=5&amp;td_id=2261530&amp;titFF=%25E5%25BE%25AE%25E8%25BD%25AF%25E9%259B%2585%25E9%25BB%2591&amp;titFS=14&amp;titSU=0&amp;titTA=left&amp;tn=baiduCustNativeAD&amp;tpr=1449556633275&amp;ts=1&amp;version=2.0&amp;xuanting=0&amp;dtm=BAIDU_DUP2_SETJSONADSLOT&amp;dc=2&amp;di=u2261530&amp;ti=Android%E4%B8%AD%E7%9B%91%E5%90%ACHome%E9%94%AE%E7%9A%844%E7%A7%8D%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93_Android_%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6&amp;tt=1449556633249.103.124.125" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="display: block;"></iframe>

昨天需要处理一个问题,需要监听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();  
   }  

加了权限之后也不行。
复制代码代码如下:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" >  
   </uses-permission>  

 
实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用:
 
方法1:onSaveInstanceState方法
  下面这个方法可以处理home的监听问题。
复制代码代码如下:

protected void onSaveInstanceState(Bundle outState)  

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

方法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

0 0
原创粉丝点击