2010-02-17 114 views
0

我有一個Android應用程序。我爲我的一項活動添加了一個意圖過濾器,這樣如果在瀏覽器應用程序中單擊一個URL,我的活動就可以啓動。看起來像這樣:打破任務障礙

<data android:host="www.mysite.com" android:scheme="http"></data> 

這很好。問題在於,每次從瀏覽器啓動我的活動時,都會在瀏覽器應用程序的任務內創建一個活動的新實例,而不是回收可能已在系統中的任何現有實例。

這對我來說是一個問題,因爲此活動使用單例。如果我允許這個活動的多個實例存在,我可以進入一些奇怪的情況,當兩個實例試圖共享單例時,這兩個實例發生衝突。我檢查並可以看到,儘管活動實例可能在單獨的任務中,但他們確實共享相同的單例實例。

對我來說,一個理想的解決方案是,如果我能以某種方式將我的應用程序的預先存在的實例帶到前臺,並在我的應用程序的任何預先存在的實例恰好運行時啓動或恢復目標活動。

所以,我想這一點:

  1. 註冊上述過濾指向虛活動這僅僅是一個接球手。
  2. 虛擬活動創建廣播意圖,並嘗試向系統廣播「創建我」消息。
  3. 實際目標活動設置爲偵聽此廣播消息。希望如果系統中已經有一個活動實例,它將會出現在前臺。如果還沒有實例,那麼可以在瀏覽器任務中創建。

不確定這是否合理。我的基本目標是將活動限制爲系統中的一個實例。該應用程序只是社交媒體應用程序,它具有需要保留的登錄狀態。上面提到的單例保留了登錄狀態,所以我想在系統中只有一個,而不是允許運行多個登錄實例,這對用戶來說會很頭疼。

感謝

回答

0

您可以設置活動啓動模式singleTop實現這一目標。

android:launchMode 有關如何啓動活動的說明。有四種模式與Intent對象中的活動標誌(FLAG_ACTIVITY_ *常量)一起工作,以確定在調用活動來處理意圖時應該發生什麼。它們是: 「standard」 「singleTop」 「singleTask」 「singleInstance」 默認模式是「standard」。

https://developer.android.com/guide/topics/manifest/activity-element.html#lmode

+0

嗨sadboy,我已經設置launchMode到singleTop,但仍然沒有效果。我可以打印活動的mem地址,並查看每次瀏覽器啓動一個新實例時,它是一個不同的mem地址,而不僅僅是恢復已經運行的實例。 – user246114 2010-02-17 07:10:41

+0

這很奇怪。你是否把它放在聲明活動的應用程序清單中?我猜你試過其他的啓動模式,比如singleinstance嗎? – 2010-02-17 16:15:28