Как определить, когда моя активность была скрыта?

Я хотел бы иметь возможность обнаружить, была ли моя активность скрыта, скажем, системным предупреждением или каким-либо другим наложением (например, меню питания, когда я долго нажимаю кнопку питания), или каким-либо вредоносным ПО, которое обнаруживает запуск моего Деятельность. Я заметил, что приложение переднего плана в этом случае все еще будет моим приложением, поэтому я не могу просто основать его на том, что такое приложение переднего плана. Я также заметил, что onPause() не вызывается, когда моя активность скрыта, поэтому я не могу также добавить логику в onPause(). Хотя даже если бы я мог, мне тогда пришлось бы различать системное предупреждение / наложение и пользователя, нажимающего кнопку назад / домой.

Есть ли у меня другие способы сделать это?

2 ответа

Вы можете проверить, является ли действие, фрагмент или вид скрытым.

Для 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. Чтобы проверить, не скрыт ли фрагмент, выполните следующий фрагмент кода во фрагменте, который принадлежит операции OverlayTouchActivity:

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

Пожалуйста, смотрите фрагмент AppPermissionsFragment.java (ищите OverlayTouchActivity).

Для просмотра вы должны переопределить метод onFilterTouchEventForSecurity. Для получения дополнительной информации, пожалуйста, смотрите раздел безопасности документации View.

Вы можете использовать PackageManager для запроса, чей из установленных пакетов имеет подозрительные разрешения, такие как SYSTEM_ALERT_WINDOW, BIND_ACCESSIBILITY_SERVICE или BIND_DEVICE_ADMIN.

Некоторые идеи кода

Другие вопросы по тегам