AlertDialog.show молча игнорируется внутри службы - PullRequest
1 голос
/ 09 ноября 2010

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

Тамявляется обработчиком, зарегистрированным в фоновом потоке и показывающим уведомление Toast, в котором обработчик работает нормально.Но после переключения на AlertDialog больше ничего не происходит.Моя логика showDialog молча игнорируется.Диалоговое окно не появляется, нет записи в журнале.Это немного странно, так как я ожидаю, по крайней мере, запись в журнале о том, что я делаю что-то не так или что-то в этом роде.

Есть ли какие-либо ограничения для отображения AlertDialog, инициированного из фонового потока службы?Некоторые люди, похоже, рекомендуют занятие на тему диалога, чтобы получить похожее поведение.

Любое разъяснение или помощь в его работе приветствуется!

Ив

Ответы [ 3 ]

1 голос
/ 09 ноября 2010

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

<activity android:label="@string/app_name" android:name="YourDialog" android:theme="@android:style/Theme.Dialog"/>

Затем, чтобы начать свою деятельность:

Intent dialog = new Intent(this, YourDialog.class);
dialog.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialog);

Обратите внимание, что это асинхронно и не блокирует. Если вы хотите обработать результат, вам придется использовать startService () и передать пользовательское действие, чтобы указать результат.

Эммануил

1 голос
/ 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 голос
/ 09 ноября 2010

Существуют ли какие-либо ограничения для отображения AlertDialog, инициированного из фонового потока службы?

Ограничение: это невозможно, AFAIK. Вы должны показывать диалоги из основного потока приложения, а не просто произвольный поток, в котором у вас есть Handler.

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

Казалось бы, это наиболее вероятное решение, AFAICT.

...