我希望能够检测我的 Activity 是否被系统警报或其他覆盖物(例如,当我长按电源按钮时的电源菜单)或某些检测到我的启动的恶意软件所掩盖活动。我注意到在这种情况下前台应用程序仍然是我的应用程序,所以我不能简单地基于前台应用程序是什么。我还注意到,当我的 Activity 被遮挡时,不会调用 onPause(),因此我也不能在 onPause() 中放入任何逻辑。即使可以,我也必须区分系统警报/覆盖和用户按下后退/主页按钮。
我还有其他方法可以做到这一点吗?
我希望能够检测我的 Activity 是否被系统警报或其他覆盖物(例如,当我长按电源按钮时的电源菜单)或某些检测到我的启动的恶意软件所掩盖活动。我注意到在这种情况下前台应用程序仍然是我的应用程序,所以我不能简单地基于前台应用程序是什么。我还注意到,当我的 Activity 被遮挡时,不会调用 onPause(),因此我也不能在 onPause() 中放入任何逻辑。即使可以,我也必须区分系统警报/覆盖和用户按下后退/主页按钮。
我还有其他方法可以做到这一点吗?
您可以检查 Activity、Fragment 或 View 是否被遮挡。
对于 Activity您需要覆盖dispatchTouchEvent方法并检查事件是否具有标志FLAG_WINDOW_IS_OBSCURED。有示例代码:
public class OverlayTouchActivity extends Activity {
private boolean mObscuredTouch;
public boolean isObscuredTouch() {
return mObscuredTouch;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
mObscuredTouch = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0;
return super.dispatchTouchEvent(event);
}
}
这是 Android 代码的一部分,请检查OverlayTouchActivity.java。为了检查 Fragment 是否被遮挡,请在属于 OverlayTouchActivity 活动的 Fragment 中执行以下代码:
OverlayTouchActivity activity = (OverlayTouchActivity) getActivity();
if (activity.isObscuredTouch()) {
// Fragment is bbscured
}
请参阅AppPermissionsFragment.java片段(搜索OverlayTouchActivity)。
对于 View,您应该覆盖onFilterTouchEventForSecurity方法。有关详细信息,请参阅查看文档的安全部分。
您可以使用 PackageManager 查询已安装的软件包中谁具有可疑权限,如 SYSTEM_ALERT_WINDOW、BIND_ACCESSIBILITY_SERVICE 或 BIND_DEVICE_ADMIN。