2009-06-22 45 views
9

我需要一個彈出對話框來顯示,當我從不同的線程得到消息,但對話框應該不依賴於活動,即它應該顯示對話框的任何焦點屏幕。彈出對話框Android從後臺線程

可以這樣做嗎?因爲對話框是按照Activity來處理的,所以我想到了使用一個服務,但是又一次添加了一個線程,我想避免這種情況。

還有其他選擇嗎?

+0

我相信他試圖問這個問題:如何從一個單獨的線程中運行的服務啓動一個對話框?可能有任何數量的活動正在運行。要顯示對話框,您需要指定當前活動。 – 2010-10-13 23:24:28

+0

一種可能的解決方案是使用的活性: http://stackoverflow.com/posts/3912748/revisions – 2013-01-29 08:10:59

+0

https://stackoverflow.com/a/29804684/2149195 – RBK 2017-09-12 13:36:11

回答

17

如果您嘗試詢問當您的活動不是用戶手機上的焦點活動時如何顯示對話框,請嘗試使用通知。通過不同的應用程序彈出對話框會在用戶做其他事情時中斷用戶。從Android UI guidelines

使用通知系統 - 代替 通知

如果你的後臺服務需要不 使用對話框來 通知用戶,使用標準 通知系統 - 不要使用 對話框或吐司來通知他們。一個 對話框或吐司將立即採取 焦點和打斷用戶,採取 注意力從他們在做什麼: 用戶可以在 鍵入文字的那一刻對話框 出現的中間,可以在 的意外行爲對話。用戶習慣於通過 處理通知,並可以通過 下拉 便利性來回復您的 消息。

的指南創建的通知是在這裏:http://developer.android.com/guide/topics/ui/notifiers/notifications.html

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

如果我理解正確的話,你可以使用一個基類所有活動的

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(..)但是這種方法不起作用,如果你想要在目標設備的任何活動之上顯示對話框。