2015-11-26 69 views
3

我一直在閱讀有關啓動模式的文檔,有一件事我沒有理解。該doc說singleTask活動始終是堆棧的根:android singleTask活動不是作爲根?

與此相反,「singleTask」和「singleInstance」活動只能 開始的任務。 它們始終位於活動堆棧的根部。此外,該設備只能在 時間內僅保留一個活動實例 - 只有一個這樣的任務。

但是:如果你看一下文檔的this部分在Figure 4,您會看到活動2開始時活動Y(把這個任務給前臺),活動Y信號已對任務的頂部,並將於當前任務的頂部,而不是根。

我在這個simulation app中嘗試了這個場景,當我創建singleTask活動時,它總是創建一個新任務。但是,如果唯一的實例已經存在,它將完成所有高於此的活動,所以唯一的實例可以是根(也是任務中的唯一活動)。

活動Y如何成爲活動X上方任務的頂部?

有沒有其他原因我錯過了? PS:我也不太瞭解任務和背部堆棧之間的區別。

回答

5

像往常一樣(嘆氣),文檔是錯誤的。在你引用的圖表中,顯然Activity Y不能被定義爲singleTask,而是包含2個活動的後臺任務中的頂級活動。

測試時有特殊啓動模式singleTasksingleInstance情況請注意taskAffinity扮演這一行爲的重要作用,爲taskAffinity在特推出模式優先。


關於「任務」和「後堆」之間的差:

A「任務」是可被操縱的整體組活動的堆疊。

  • 當您啓動應用程序(假設它當前未運行)時,Android會在前臺創建一個新任務,其中包含您啓動的應用程序的根活動。
  • 當該活動開始新活動時,這些新活動會添加到當前任務(通常,雖然此行爲有例外)。
  • 當您按HOME按鈕時,當前任務從前景移動到背景。
  • 當您顯示「最近」列表時,顯示的是最近的任務列表,而不是最近的活動列表或最近的應用程序列表。
  • 當您從近期任務列表中選擇任務時,如果該任務仍處於活動狀態(仍有活動),則整個任務(包括其所有活動)將從後臺移至前臺。
  • 任務也可以「堆疊」。當前任務中的活動在新任務中啓動活動時,新任務將堆疊在當前任務的頂部。這僅用於控制新任務完成時發生的情況。在通常情況下,當新任務完成時(所有活動都已完成),Android會將用戶返回到上一個任務(即:開始完成任務的任務)。

「退棧」通常是指任務內的一組活動。每個任務都有自己的一堆活動。這用於控制當前活動(返回堆棧頂部的活動)完成時發生的情況。通常情況下,Android會將用戶返回到直接位於後面堆棧中整理活動下方(下方)的活動。

Android代碼和文檔通常指任務的「根」(這是用於啓動任務的活動)和任務的「頂部」或「前部」(這是目前正在顯示)。


實際上,文件位於:-(下面是一個例子:

與此相反, 「singleTask」 和 「singleInstance」 活動只能 開始任務

這聲明通常但並不總是正確的例如,假設我有兩項活動:ABA是發起活動(即:ACTION=MAINCATEGORY=DEFAULT),並使用標準啓動模式進行定義。 B定義爲launchMode="singleTask"。我啓動應用程序,Android創建一個A的實例。在A我然後執行:

startActivity(new Intent(this, B.class)); 

這將創建活動B的新實例,並把它的A頂部相同的任務。它不會以活動B作爲根創建新任務。原因是活動A和活動B具有相同的taskAffinity(默認情況下,應用程序的所有活動都具有相同的taskAffinity),在這種情況下,Android將忽略B的啓動模式。

的文件也說:

此外,該設備可以在 一次只持有一個活動的實例 - 只有一個這樣的任務。

再次,taskAffinity可以打破這種行爲。再假設我們有A,BC,全部使用相同(默認)taskAffinityAC有標準啓動模式,BlaunchMode="singleTask"。如果A開始B,則B的實例不在新任務中,而是在與A(參見上文)相同的任務中結束。現在B開始C。 Android會創建一個C的實例,並將其放在B的頂部。現在C電話:

startActivity(new Intent(this, B.class)); 

的Android創建的B一個新的實例,並在任務提出本上C頂部。現在有B的兩個實例,它們都不是任務的根活動!這種行爲也是由於taskAffinity勝過啓動模式。

+0

感謝您的不同!但你所描述的親和力仍然讓我想知道。如果我在我的原始文章中指定的應用中嘗試了第一個示例,則它的行爲如預期 - 創建了新任務。爲了符合你所說的話......他們必須改變親和力才能獲得這種行爲?我對此有所懷疑。 – Tomask

+0

你說得對。我已經創建了一個示例項目,並按照您的說法工作。他們真的不得不改變我猜測的親和力。或者只是不同的包名稱就夠了? (我通常在同一個包中包含所有活動)但是當我想要打開新任務時,如何在我的應用中完成此行爲?我必須在每個活動中指定不同的親和力?這很奇怪。 – Tomask

+0

任務關聯用於將應該處於相同任務中的活動組合在一起。一般而言,在單個應用程序中,您會希望所有(或大部分)活動都在同一個任務中。你很少需要創建多個任務。如果您確實需要創建多個任務,則會出現很多「疑難雜症」,因爲您還需要確保用戶能夠區分這些任務,以便他能夠返回到正確的任務。這通常意味着爲不同的任務設置不同的應用程序圖標和不同的應用程序名請描述你爲什麼需要不同的任務。 –

相關問題