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