像往常一樣(嘆氣),文檔是錯誤的。在你引用的圖表中,顯然Activity Y不能被定義爲singleTask
,而是包含2個活動的後臺任務中的頂級活動。
測試時有特殊啓動模式singleTask
和singleInstance
情況請注意taskAffinity
扮演這一行爲的重要作用,爲taskAffinity
在特推出模式優先。
關於「任務」和「後堆」之間的差:
A「任務」是可被操縱的整體組活動的堆疊。
- 當您啓動應用程序(假設它當前未運行)時,Android會在前臺創建一個新任務,其中包含您啓動的應用程序的根活動。
- 當該活動開始新活動時,這些新活動會添加到當前任務(通常,雖然此行爲有例外)。
- 當您按HOME按鈕時,當前任務從前景移動到背景。
- 當您顯示「最近」列表時,顯示的是最近的任務列表,而不是最近的活動列表或最近的應用程序列表。
- 當您從近期任務列表中選擇任務時,如果該任務仍處於活動狀態(仍有活動),則整個任務(包括其所有活動)將從後臺移至前臺。
- 任務也可以「堆疊」。當前任務中的活動在新任務中啓動活動時,新任務將堆疊在當前任務的頂部。這僅用於控制新任務完成時發生的情況。在通常情況下,當新任務完成時(所有活動都已完成),Android會將用戶返回到上一個任務(即:開始完成任務的任務)。
「退棧」通常是指任務內的一組活動。每個任務都有自己的一堆活動。這用於控制當前活動(返回堆棧頂部的活動)完成時發生的情況。通常情況下,Android會將用戶返回到直接位於後面堆棧中整理活動下方(下方)的活動。
Android代碼和文檔通常指任務的「根」(這是用於啓動任務的活動)和任務的「頂部」或「前部」(這是目前正在顯示)。
實際上,文件位於:-(下面是一個例子:
與此相反, 「singleTask」 和 「singleInstance」 活動只能 開始任務
這聲明通常但並不總是正確的例如,假設我有兩項活動:A
和B
。A
是發起活動(即:ACTION=MAIN
和CATEGORY=DEFAULT
),並使用標準啓動模式進行定義。 B
定義爲launchMode="singleTask"
。我啓動應用程序,Android創建一個A
的實例。在A
我然後執行:
startActivity(new Intent(this, B.class));
這將創建活動B
的新實例,並把它的A
頂部相同的任務。它不會以活動B
作爲根創建新任務。原因是活動A
和活動B
具有相同的taskAffinity
(默認情況下,應用程序的所有活動都具有相同的taskAffinity
),在這種情況下,Android將忽略B
的啓動模式。
的文件也說:
此外,該設備可以在 一次只持有一個活動的實例 - 只有一個這樣的任務。
再次,taskAffinity
可以打破這種行爲。再假設我們有A
,B
和C
,全部使用相同(默認)taskAffinity
。 A
和C
有標準啓動模式,B
有launchMode="singleTask"
。如果A
開始B
,則B
的實例不在新任務中,而是在與A
(參見上文)相同的任務中結束。現在B
開始C
。 Android會創建一個C
的實例,並將其放在B
的頂部。現在C
電話:
startActivity(new Intent(this, B.class));
的Android創建的B
一個新的實例,並在任務提出本上C
頂部。現在有B
的兩個實例,它們都不是任務的根活動!這種行爲也是由於taskAffinity
勝過啓動模式。
感謝您的不同!但你所描述的親和力仍然讓我想知道。如果我在我的原始文章中指定的應用中嘗試了第一個示例,則它的行爲如預期 - 創建了新任務。爲了符合你所說的話......他們必須改變親和力才能獲得這種行爲?我對此有所懷疑。 – Tomask
你說得對。我已經創建了一個示例項目,並按照您的說法工作。他們真的不得不改變我猜測的親和力。或者只是不同的包名稱就夠了? (我通常在同一個包中包含所有活動)但是當我想要打開新任務時,如何在我的應用中完成此行爲?我必須在每個活動中指定不同的親和力?這很奇怪。 – Tomask
任務關聯用於將應該處於相同任務中的活動組合在一起。一般而言,在單個應用程序中,您會希望所有(或大部分)活動都在同一個任務中。你很少需要創建多個任務。如果您確實需要創建多個任務,則會出現很多「疑難雜症」,因爲您還需要確保用戶能夠區分這些任務,以便他能夠返回到正確的任務。這通常意味着爲不同的任務設置不同的應用程序圖標和不同的應用程序名請描述你爲什麼需要不同的任務。 –