Запуск диалога из сервиса - PullRequest
       30

Запуск диалога из сервиса

5 голосов
/ 02 декабря 2011

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

Моя проблема в том, что пользователь открывает приложение, запускает главное меню и затем нажимает HOME, чтобы выйти.При нажатии HOME действие основного меню остается на паузе, а не уничтожается, и когда служба запускает диалоговое окно, главное меню отображается под прозрачным действием;в результате чего диалоговое окно теряет эффект зависания над тем, на что смотрит пользователь.

Как сделать так, чтобы прозрачное действие открывалось независимо от других действий в приложении?Единственный способ предотвратить это в настоящее время - завершить все действия, когда они приостановлены;но это нецелесообразно.

Ответы [ 3 ]

13 голосов
/ 02 декабря 2011

Это - последнее, что мы хотим. : -)

1. Диалоговые окна из Сервисов

Один из лучших примеров использования мобильных устройств, в частности IMHO и Android, заключается в том, что спустя десятилетия мы избавились от общесистемных, надоедливых диалоговых предупреждений. Наконец, лучшие практики [ 1 , 2 ] для взаимодействия с пользователем позволили нам избежать позорного распространяющегося использования MessageBox(hwnd, lpText, lpCaption, uType), борющегося за фокус и внимание бедного пользователя. , Смотрите видео пародию выше.

Причина, по которой неудобно начинать диалог с Service, заключается именно в том, что предполагается, что это фоновая задача, без взаимодействия с пользователем. По идее, вы не должны делать это. Вот почему мы видим эти уловки (прозрачные действия, что за глупость), чтобы обмануть руководящие принципы проектирования в первую очередь. Они плохие, они нарушают пользовательский опыт, они крадут внимание и внимание. Они нарушают нашу работу.

2. Вместо этого используйте уведомления

Всякий раз, когда вы хотите уведомить пользователя о чем-то из фона, когда пользователь находится где-то еще, вы используете уведомление. Это шаблон по умолчанию, и он не беспокоит пользователя.

Следовательно, вы должны отправлять уведомления от вашего Service.

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

3. Наконец, НЕ используйте FLAG_ACTIVITY_MULTIPLE_TASK

Вы не должны , когда-либо , используйте этот флаг, если вы не внимательно прочитали и не полностью поняли документацию и последствия использования этого флага.

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

Действительно. В этом случае просто не надо.

2 голосов
/ 04 июля 2015

Вы можете рассмотреть возможность использования alertDialog с TYPE_SYSTEM_ALERT вместо активности:

AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setTitle("Title")
                    .setMessage("Are you sure?")
                    .create();

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();

Обратите внимание, что вам необходимо использовать следующее разрешение:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
1 голос
/ 02 декабря 2011

Обнаружил это сам, просто добавив флаг Intent.FLAG_ACTIVITY_MULTIPLE_TASK в намерение запуска;конечно в сочетании с флагом Intent.FLAG_ACTIVITY_NEW_TASK.

...