Android中监听Home键的4种方法总结_安卓软件开发教程-查字典教程网
Android中监听Home键的4种方法总结
Android中监听Home键的4种方法总结
发布时间:2016-12-28 来源:查字典编辑
摘要:昨天需要处理一个问题,需要监听home键。最开始想到使用onKeydonwn这个方法。但是发现home不能这样处理,onKeydonwn可以...

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

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安卓软件开发学习
    热门安卓软件开发学习
    编程开发子分类