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

更多相关文章

  1. View视图绘制流程,View工作原理(二)
  2. Alibaba-AndFix Bug热修复框架原理及源码解析
  3. Android(安卓)java.lang.UnsatisfiedLinkError: dalvik.system.P
  4. Android(安卓)Service的使用
  5. Android(安卓)四大组件(Activity、Service、BroadCastReceiver、
  6. Android的Animation之LayoutAnimation使用方法(控件设置动画)
  7. Android(安卓)Service完全解析(下)
  8. Gradle Build速度加快终极方法
  9. android中path的arcTo方法的使用

随机推荐

  1. 华熙集团:十年如一日发展传统文化
  2. Java并发编程--ReentrantReadWriteLock
  3. 一篇文章完全掌握 JavaScript 数组操作[
  4. 没想到 Unicode 字符还能这样玩?
  5. Linux学习-第八周
  6. Dubbo 高危漏洞!原来都是反序列化惹得祸
  7. 从SpringBoot到SpringMVC
  8. 你可能没有细究过的TCP/IP
  9. 利用TICK搭建Docker容器可视化监控中心
  10. Docker容器跨主机通信之:直接路由方式