2009-06-22 2 views
9

Мне нужно всплывающее диалоговое окно, которое будет отображаться, когда я получаю сообщение из другого потока, но диалог не должен зависеть от Activity i.e, он должен отображать диалог везде, где есть фокус экрана.Диалог PopUp Android из фоновой темы

Можно ли это сделать? Поскольку диалог обрабатывается за активность, я думал об использовании службы, но опять же это будет еще один поток, и я хочу этого избежать.

Есть ли другие варианты?

+0

Я считаю, что он пытается это спросить: как вы можете начать диалог с сервисом, работающим в отдельном потоке? Там может быть любое количество операций. Чтобы показать диалог, вам нужно указать текущую активность. –

+0

Возможное решение - использовать вид деятельности: http://stackoverflow.com/posts/3912748/revisions – 2013-01-29 08:10:59

+0

https://stackoverflow.com/a/29804684/2149195 – RBK

ответ

17

Если вы пытаетесь спросить, как показывать диалог, когда ваша деятельность не является целенаправленной деятельностью на телефоне пользователя, попробуйте вместо этого использовать уведомления. Появление диалога по другому приложению прерывает пользователя, когда они могут что-то делать. Из Android UI guidelines:

Используйте систему уведомления, - не диалоговые использования коробки в месте уведомлений

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

Руководство для создания уведомлений здесь: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

+0

hi, Как у телефона есть делегат приложения, который всегда послушайте изменения в пользовательском интерфейсе, есть ли что-нибудь подобное в Android? – Sam97305421562

+0

Facebook Messenger (Bubbles) не соответствует этому правилу. , , – sospedra

+0

@Бурсос Я не уверен, в чем дело. Facebook часто не придерживается рекомендаций Android UI. Кроме того, пузырьки не захватывают ввод пользователя, как диалог. – Intrications

1

Альтернативное решение:

AlertDialog dialog; 
//add this to your code 
    dialog = builder.create(); 
    Window window = dialog.getWindow(); 
    WindowManager.LayoutParams lp = window.getAttributes(); 
    lp.token = mInputView.getWindowToken(); 
    lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 
    window.setAttributes(lp); 
    window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 
//end addons 
alert.show(); 
+1

Итак ... как вы думаете, я могу получить mInputView в фоновом потоке? ;) – Janusz

+0

(новый AlertDialog.Builder (myAppContext)). Create() дает мне java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare(). –

+0

вы должны использовать контекст действия, а не контекст приложения. – Sulby

1

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

public abstract class BaseActivity extends Activity{ 
    protected static BaseActivity current_context = null; 

    @override 
    protected void onPause(){ 
     current_context = null; 
     super.onPause(); 
    } 

    @override 
    protected void onResume(){ 
     current_context = this; 
     super.onResume(); 
    } 

    public static void showDialog(/*your parameters*/){ 
     //show nothing, if no activity has focus 
     if(current_context == null)return; 
     current_context.runOnUiThread(new Runnable() { 
      @override 
      public void run(){ 
       AlertDialog.Builder builder = 
        new AlertDialog.Builder(current_context); 
       //your dialog initialization 
       builder.show(); 
      } 
     }); 
    } 
} 

в вашем потоке покажите свой диалог с BaseActivity.showDialog(..) Но этот подход не работает, если вы хотите показать свой диалог сверху любой активность целевого устройства.

Смежные вопросы