2012-07-27 144 views
3

這是場景。我在我的應用程序中有兩個活動,並且在單擊由我的應用程序創建的通知時啓動了一個對話活動。 問題是,當我點擊通知時,只有對話框應該顯示,而不是我的應用程序的其他活動,如果它停止按主頁按鈕。對話框活動還會在後臺恢復其他活動

當我按下後退按鈕關閉我的應用程序時,對話框活動顯示對話框,但是當應用程序在後臺運行時,該活動也會在創建對話框活動時打開。

我使用@android:style/Theme.Dialog進行我的對話活動。

如何僅顯示對話框活動,而不是背景中的其他活動?

+0

你完成()你以前這將啓動對話框活動活動? – 2012-07-27 09:41:05

+0

對話活動由通知聲明..我想要做的是應用程序的主要活動不應該出現在創建對話框活動時,如果用戶不按關閉鍵關閉主要活動。 – 2012-07-27 09:42:55

回答

2

解決OP問題的方法是在Manifest中爲該活動設置不同的Task關聯。

<activity android:name="MyIndependentActivity" 
android:theme="@android:style/Theme.Dialog" 
android:taskAffinity="a_unique_id"> 

的taskAffinity字符串必須從包名稱(com.whatever.myapp)

我也使用Android的不同:excludeFromRecents =「真」,隱藏從最近的應用程序列表的對話框,因爲通常沒有任何意義返回到對話框。

更多信息:http://developer.android.com/guide/components/tasks-and-back-stack.html#Affinities

0

是的,會發生。

當您聲明Dialog的主題時,它會影響活動的生命週期,並且以前的活動不會進入onStop,因此一些Android功能仍然認爲它是活動活動,因爲您的對話框Activity就像對話框一樣行事。

如果你不'關心'你可以看到對話框後面的活動,那麼一個可能的解決方法是將對話框更改爲DialogFragment,將對話框的主題放在片段上並將其顯示在它自己的活動,這將做到這一點。

+0

如何做到這一點? 我真正想要做的只是對話活動應該開始,而不影響背景中的任何東西。 我不希望看到我的應用程序的之前的活動。 – 2012-07-27 09:52:30

+0

但是您會看到它,因爲它位於應用程序的Activity堆棧中。如果你想在對話框上它自己的運行,使用'singleTask' launchMode在AndroidManifest:http://developer.android.com/guide/components/tasks-and-back-stack.html#TaskLaunchModes – Blundell 2012-07-27 10:28:36

0

我這樣做的方式(並不是最好的方法)是在activity.onPause()和activity.onResume()方法中有一些邏輯,它會根據我想要的是。我的經驗更多的是圍繞單獨的活動和他們之間的轉換,而不是使用對話。

您可以通過setResult()在活動之間傳遞信息。這將使您能夠確定孩子活動決定關閉的原因。與onResume函數結合使用,可以禁用父級活動。

要覆蓋對話框以便其他活動在其後面不可見,可能需要使用onPause()方法使其變爲半透明。

我發現onStop()非常不穩定的使用,往往是不必要的。其原因在於,從開發者的角度來看,它被稱爲不可預知的,因爲onStop可以根據操作系統是否有足夠的內存等等在奇怪的時候調用onPause,但是在我的經驗中總是被稱爲可預測的。

+0

讓我試試使活動在onPause上變得透明。另外一個問題:如何使它看起來像以前在onResume?我必須再次設置內容視圖嗎? – 2012-07-27 09:57:54

+0

我相信它應該已經。如果沒有,那麼你可以重做setContentView。 – Dessus 2012-07-27 10:03:57

+0

主題化您的應用的一種好方法(即半透明背景)是使用樣式/主題。你可以在這裏看到操作系統的默認值:https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/themes.xml – Dessus 2012-07-27 10:06:53