如何检测我的活动何时被遮挡?

时间:2016-07-04 06:27:52

标签: android android-activity overlay system-alert-window

我希望能够检测到我的活动是否被系统警报或其他某些覆盖(例如我长按电源按钮时的电源菜单)或某些检测到的恶意软件所掩盖推出我的活动。我注意到在这种情况下前台应用程序仍然是我的应用程序,所以我不能简单地将它基于前台应用程序。我还注意到当我的Activity被遮挡时没有调用onPause(),所以我也不能在onPause()中放入任何逻辑。即使我可以,但我必须区分系统警报/覆盖和用户按后/主页按钮。

我还有其他方法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:4)

您可以检查是否隐藏了活动,片段或视图。

对于活动,您需要覆盖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。为了检查片段是否被遮挡,请在片段中执行属于OverlayTouchActivity活动的以下代码:

OverlayTouchActivity activity = (OverlayTouchActivity) getActivity();
if (activity.isObscuredTouch()) {
    // Fragment is bbscured
}

请参阅AppPermissionsFragment.java片段(搜索 OverlayTouchActivity )。

对于视图,您应该覆盖onFilterTouchEventForSecurity方法。有关详细信息,请参阅View文档的security section

答案 1 :(得分:0)

您可以使用PackageManager查询已安装的软件包中包含SYSTEM_ALERT_WINDOW,BIND_ACCESSIBILITY_SERVICE或BIND_DEVICE_ADMIN等可疑权限。

Some code ideas