2010-11-09 78 views
1

我有一個服務運行後臺線程。我想要做的是 顯示AlertDialog從我的後臺線程啓動。我知道 這不是推薦的通知用戶的方式,而且它會中斷工作流程(因爲他們可以在任何應用程序中彈出任何 時間),但這對我的用例來說是一種合適的方式。AlertDialog.show在服務中默默忽略

有一個處理程序註冊後臺線程並顯示 Toast通知與處理程序工作正常。但是在將 切換到AlertDialog之後,什麼也沒有發生。我的showDialog邏輯是 默默忽略。沒有對話窗口出現,沒有日誌條目。這有點 奇怪,因爲我期望至少有一個日誌條目說我在做 有什麼不對或什麼的。

顯示從 服務後臺線程發起的AlertDialog是否有任何限制?有些人似乎推薦使用Dialog主題 活動來獲得類似的行爲。

任何澄清或幫助使其工作非常感謝!

伊夫

回答

1

可以從後臺線程打開對話框。關鍵是要啓動一個活動,它看起來像一個對話框:

<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); 

注意,這是asyncrhonous,並不會阻止。如果要處理結果,則必須使用startService()並傳遞一個自定義活動來指示結果。

靈光

+0

這似乎是訣竅。顯然,它也有可能在onCreate方法中顯示AlertDialog。唯一的問題是我們需要開始一個新的任務,這意味着我們有新的活動堆棧,並用DialogActivity完成對話。這個.finish()不會回到我的最後一個任務。有沒有已知的解決方法來獲得這種行爲? – Yves 2010-11-10 20:28:51

+0

我的方法有什麼問題?當你退出它會回不去? – Emmanuel 2010-11-10 21:03:15

+0

你的方法是完全正確的。我的應用程序捆綁了服務和控制器活動來啓動/停止它。例如,我通過控制器活動啓動服務,導航到瀏覽器,然後彈出AlertDialog對話框。到現在爲止還挺好。現在,當關閉對話框(DialogActivity.this.finish();)時,我期望回到瀏覽器,但控制器活動會出現。這裏的解決方案是使用android:taskAffinity =「」屬性標記清單中的活動,使其完全獨立於控制器活動並獲得自己的空棧。 – Yves 2010-11-10 21:36:05

1

是否有顯示的AlertDialog任何限制從服務後臺線程啓動?

限制是:這是不可能的,AFAIK。您必須從主應用程序線程中顯示對話框,而不僅僅是您有Handler的任意線程。

有些人似乎推薦一個Dialog主題活動來獲得類似的行爲。

這似乎是最可能的解決方案,AFAICT。

+0

我的處理程序在服務類的主要活動中定義,並從後臺線程獲取「創建Dialog」消息。我雖然這是確保我在主應用程序線程上的方式嗎? – Yves 2010-11-09 14:25:46

1

另一個竅門是留在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" />