原文地址:
http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
此篇短文是介紹activity是如何被啟動的。
有4種模式與Intent對象中的antivity標記一起協同來決定activity被調用時的表現行為。
它們是:
“standard”
“singleTop”
“singleTask”
“singleInstance”
預設是“standard”。
下表所示,上述模式被分為兩類,“standard”和“singleTop”是一類,“singleTask”和“singleInstance”是一類。一個Activity是“standard”或“singleTop”啟動模式,可以被執行個體化多次。這些執行個體可以屬於任何task並可以位於activity棧的任何位置。典型的例子,調用startActivity()來把它們載入到棧中(除非intent對象包含FLAG_ACTIVITY_NEW_TASK標記,那樣的話會選擇不同的task---詳詢taskAffinity屬性)。
與此相反(in contast),“singleTask”和“singleInstance”的activity只能啟動一個task。它們通常在activity棧的根(root)上,此外(moreover),裝置中同一時間只保持唯一的一個activity執行個體---只有一個這樣的棧。
“standard”和“singleTop”模式在某一方面也是不同的:一旦有一個新的intent給“standard”activity,一個響應這個intent的新的執行個體就會被建立。每個執行個體會處理單獨的intent。相似的,一個“singleTop”activity的執行個體可能也會被建立去處理新的intent。然而,如果目標task已經存在一個此activity的執行個體在棧頂,這個執行個體會收到這個新intent(在onNewIntent中回調);新的執行個體就不會被建立了。在其他情況,舉個例子,如果一個已存在的“singleTop”activity執行個體在目標task
中,但沒有在棧頂,或者它在棧頂卻沒有在目標task中,一個新的執行個體就會被建立並且推進棧中。
“singleTask”和“singleInstance”模式只在一個方面有區別:“singleTask” activity允許其他activity成為task中的一部分 ,並且它通常在task棧的根部,其它activity(必須是“standard”和“singleTop”模式的activity)可以載入到這個棧上。另一方面,“singleInstance”模式的activity不允許任何其它activity載入到這個task棧上。它是這個task中唯一的activity。如果它啟動另一個activity,那個activity會被指引到不同的task中,這個行為就像在intent中用FLAG_ACTIVITY_NEW_TASK標記一樣。(linc註:通常來說,manifest中用“singleTask”啟動模式和在intent中用FLAG_ACTIVITY_NEW_TASK標記的行為是一樣的)
| 用例 |
啟動模式 |
多個執行個體? |
注釋 |
| 正常(標準)啟動模式(對大部分activity適用) |
"standard" |
是 |
預設的。系統通常會在目標task中建立這個activity的新的執行個體並路由intent給它。 |
| 正常(標準)啟動模式(對大部分activity適用) |
"singleTop" |
有條件的 |
如果activity的執行個體已經存在在目標task的棧頂,系統會通過onNewIntent()方法路由intent給這個執行個體,而不會去建立一個新的執行個體。 |
| 特殊的啟動模式(不推薦在普遍使用) |
"singleTask" |
否 |
系統建立這個activity在新的task的棧頂並路由intent給它。然而,如果一個activity的執行個體已經存在,系統會通過調用onNewIntent()方法路由intent給這個執行個體,而不會去建立一個新的執行個體。 |
| 特殊的啟動模式(不推薦在普遍使用) |
"singleInstance" |
否 |
和“singleTask”相同,唯一的差別是系統不會載入其它activity到其保持的task中。這個activity通常是它的的task中唯一的成員。 |
上表所示,“standard”是預設的模式並適合於絕大部分類型的activity。“singleTop”也是普通的很有用的啟動模式對部分類型的activity適用。其它模式,“singleTask”和“singleInstance”模式,不適用絕大多數的應用,因為它們的結果(啟動後的行為)在互動模型中對於使用者來說是不熟悉的,這與大部分的程式都非常不同。
不論你選擇了哪種啟動模式,一定要測試activity在啟動和使用BACK鍵在其它activity和task中返回時的可用性。
更多的關於啟動模式和它們使用intent標記互動的資訊,見Tasks and Back Stack文檔。
linc註:我之前寫了一篇文章是討論singleTask和intent的newtask flag行為不一致的,最近正在關注activity的相關細節,會定期總結一些東西和大家分享。