2012-07-20 111 views
8

我有一項活動可以從其他幾個活動以及url過濾器意圖中啓動。如果活動堆棧爲空,則啓動主要活動

在此活動中,我使用操作欄中的主頁圖標作爲後退按鈕,使用戶回到上一個活動(而不是「主頁」操作)。現在我通過調用finish()函數來做到這一點。從應用程序內部工作時,這工作正常。

但是,如果通過url過濾器意圖啓動活動,我希望主圖標將用戶帶到主要活動。顯然,調用finish()會關閉活動。

所以我的問題是,有沒有辦法來檢查我的應用程序堆棧是否爲空,然後啓動主要活性,如果屬實?還是我用這種錯誤的方式來攻擊?

回答

12

如果您的應用程序通過URL意圖過濾器發起並創建了自己的任務,那麼你可以使用

if (isTaskRoot()) { 
    // This activity is at root of task, so launch main activity 
} else { 
    // This activity isn't at root of task, so just finish() 
} 

編輯:添加另一種可能的方法

如果您的應用程序啓動到在通過URL意圖過濾器啓動現有任務時,您可以執行以下操作:

當您從應用程序中的其他活動啓動活動時,將額外內容添加到Intent像這樣:

Intent intent = new Intent(this, MyActivity.class); 
intent.putExtra("internal", "true"); 
startActivity(intent); 

當您的活動被推出那麼它可以在Intent檢查額外的存在與否,以確定它是否是內部或通過網址意圖過濾器推出,是這樣的:

Intent intent = getIntent(); 
if (intent.hasExtra("internal")) { 
    // Launched internally 
} else { 
    // Launched via intent-filter 
} 
+0

看起來像一個很好的解決方案,但遺憾的是它不起作用。 isTaskRoot()在兩種情況下均返回false。我想我不需要啓動一項新任務(即應用程序已經在後臺運行了嗎?)。我無法圍繞活動/任務處理打包頭。 – SveinT 2012-07-20 11:53:40

+1

編輯我的答案,添加另一種可以使用的方法,因爲您的活動顯然已啓動到現有任務中。 – 2012-07-20 12:02:31

+0

這當然應該起作用,但我會假設存在一個更清潔的解決方案? Gmail應用和其他人實施了類似的行爲。無論哪種方式,它都必須這樣做。謝謝! – SveinT 2012-07-20 12:09:21