На Android, как обнаружить системное диалоговое окно (параметры питания, последние приложения, низкий заряд батареи ...)? - PullRequest
8 голосов
/ 20 января 2012

Привет Stackoverflowers (я знаю, это не звучит так, как должно ...)

Ну, я думаю, что это почти все в вопросе: я хотел бы поймать все, что заставляет отображение моей Деятельности даже частично скрыться, например, параметры питания, панель недавних приложений, уведомление о низком заряде батареи и т. д., и мне трудно обнаружить эти системные события.

Я был почти уверен, что onPause () будет вызываться при возникновении таких событий, но, похоже, это неправильно ... или это я?

Любая другая идея? ... Я бы предпочел не подключать каждое системное действие в отдельности, поскольку я хотел бы быть как можно более общим (и реагировать на НИЧЕГО, что скрывает мою активность).

Спасибо за любой вклад!

Ответы [ 2 ]

7 голосов
/ 07 августа 2014

При работе над приложением в стиле киоска я знаю, что некоторые диалоги выходят на передний план и могут быть обнаружены

    ActivityManager activityManager = (ActivityManager)getBaseContext()
       .getSystemService(Activity.ACTIVITY_SERVICE);
    String className = activityManager.getRunningTasks(1).get(0).topActivity.getClassName();

Примером этого является диалоговое окно привязки Bluetooth, которое выводит com.android.settings на передний план.

Контрпримером является диалоговое окно кнопки питания («Выключить», «Перезагрузка» и т. Д.), Которое не выходит на передний план.

Обратите внимание, что вы можете закрыть системные диалоги (даже диалог кнопки питания) с помощью этой трансляции:

    Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        sendBroadcast(closeDialog);

Но на большинстве (всех более новых?) Устройств эта широковещательная рассылка даже закрывает программную клавиатуру, поэтому не рекомендуется запускать службу, которая часто отправляет ее, так как тогда пользователь не сможет ничего вводить в текстовое поле.

Обратите внимание, что такое поведение определенно удовлетворит ваше приложение как вредоносное ПО, не позволяя опубликовать его в Google Play.

0 голосов
/ 20 января 2012

Я был почти уверен, что onPause () будет вызываться при возникновении таких событий, но кажется, что это неправильно ... или это я?

onPause() будет вызыватьсяесли другой вид деятельности переходит на передний план.Таким образом, если бы на первый план вышло стороннее приложение, даже с деятельностью в виде диалога, было бы вызвано onPause().

Нет необходимости вызывать onPause() из компонентов ОС, хотя.

Я бы предпочел не подключаться к каждому действию системного вещания в отдельности, поскольку я хотел бы быть как можно более универсальным (и реагировать на НИЧЕГО, что скрывает мою активность).

То, что вы хотите, не возможно.Не все вещи, которые вы перечисляете, передают Intents, и есть другие методы, которые люди могут использовать (например, Toasts), которые затенят часть вашей деятельности, о которой вы не будете знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...