您的位置:首页 > 其它

屏蔽Home键

2016-04-13 21:00 246 查看
  在2.2,2.3版本上重写下面方法就能重写home键
    public void onAttachedToWindow() {
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
        super.onAttachedToWindow();
    }
    但是在4.0以上就不能用了。
     刚刚发现4.0上还有一种方法可以屏蔽和重写Home键,而且非常简单。代码如下:
    public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//关键代码
        setContentView(R.layout.main);
    }
    再重写onKey事件即可。

    请大神指点。

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