项目需要在Androi 应用中捕获HOME键,找了一下网上的资料,找到解决方法如下:
在Android应用中重载onAttachedToWindow方法:
public void onAttachedToWindow() {
if(catchHomeKey)
{
Log.d(TAG, "onAttachedToWindow");
String v = SystemProperties.get("ipanel_home").trim();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
super.onAttachedToWindow();
}
onAttachedToWindow是在第一次onDraw前调用的。也就是我们写的View在没有绘制出来时调用的,但只会调用一次。
这里将Windows的Type设置为TYPE_KEYGUARD
我们再看下系统Home键的处理流程,具体参照:
http://blog.csdn.net/wdaming1986/article/details/7539600
主要是PhoneWindowManager.java,中间有一个函数:interceptKeyBeforeDispatching
WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
if (attrs != null) {
final int type = attrs.type;
// final int ipanel_home = attrs.ipanel_home;
if (type == WindowManager.LayoutParams.TYPE_KEYGUARD
|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {
// the "app" is keyguard, so give it the key
return false;
}
这里获取window type,如果为type_keyguard,则返回false,表示应用需要捕获,这样在应用中OnKeyDown函数中就能够监听到按键了。
另外如果不捕获Home键,但是招安Home键没有回到Android的Home,需要看下Settings.Secure.DEVICE_PROVISIONED这个值是否有问题。