您的位置:首页 > 移动开发 > Android开发

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

2016-09-20 16:20 357 查看

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

   这篇文章主要介绍了Android中监听Home键的4种方法总结,本文讲解了onSaveInstanceState方法、onUserLeaveHint方法、ACTION_CLOSE_SYSTEM_DIALOGS、framework PhoneWindowManager.java等4种方法,需要的朋友可以参考下:

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

            } 

        } 

    } 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  重写home键 home键 home