Android5.0 拦截HOME键
以下内容主要是做笔记为主,暂时在Android5.0上测试是有效的,直接上代码
解决办法:
通过系统源码知道FLAG_HOMEKEY_DISPATCHED的值,自定义:
private static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
然后通过反射设置window.getAttributes().privateFlags
private void blockHomeKey(Window window) {
WindowManager.LayoutParams attrObj = window.getAttributes();
Class<?> attrClass = attrObj.getClass();
try {
Field field = attrClass.getField("privateFlags");
field.setAccessible(true);
field.setInt(attrObj, FLAG_HOMEKEY_DISPATCHED);
} catch (Exception e) {
e.printStackTrace();
}
}
设置PRIVATE_FLAG_KEYGUARD后拦截失败的原因是:
PhoneWindowManager中adjustWindowParamsLw()方法把attrs.privateFlags值改了
@Override
public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) {
...
if (attrs.type != TYPE_STATUS_BAR) {
// The status bar is the only window allowed to exhibit keyguard behavior.
attrs.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
}
...
}
参考链接
Android关于Activity屏蔽/拦截Home键: https://blog.csdn.net/rentee/article/details/79246776