欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-06-16 10:53:17
昨天需要处理一个问题,需要监听home键。最开始想到使用onkeydonwn这个方法。但是发现home不能这样处理,onkeydonwn可以处理菜单键和back键,但hom...

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