重溫Android四大組件(二)—Activity的啓動模式與標誌位

前言

重溫Android四大組件的第二篇,主要總結Activity的啓動模式以及相關的標誌位。Activity啓動模式是Activity的一個重要的屬性,啓動模式決定了Activity在Activity棧的存在的行爲。不同的啓動模式下的Activity有不同的表現,所以開發者需要搞清楚各個啓動模式的特性以及相互之間的區別。

Activity的啓動模式

  • standard(標準模式):這是系統默認的啓動模式。每次啓動standard模式的Activity不管在Activity棧中是否存在Activity的實例,都會創建一個新的Activity實例。另外,被啓動的Activity會在啓動它的Activity所在的棧中存在。

  • singleTop(棧頂複用模式):在這種模式下啓動Activity,如果被啓動的Activity實例位於當前棧的棧頂,那麼將複用棧頂的Activity實例。否則,重新創建一個Activity實例。在上節講過,如果複用Activity實例,將調用onNewIntent方法,而不是重建Activity。

  • singleTask(棧內複用模式):在這種模式下啓動Activity系統會創建新的Activity棧用來實例化Activity實例(默認情況下,Activity會在啓動它的Activity棧中實例化)。如果Activity棧中存在Activity實例,就會複用Activity實例,同時從onNewIntent方法開始Activity的生命週期,同時singleTask模式下的Activity帶有clearTop的效果,也就是說複用棧中Activity實例的時候會將位於當前Activity實例上面的Activity實例銷燬。

  • singleInstance(單實例模式):在這種模式下啓動Activity是系統會創建一個新的Activity棧並且這個棧中只存在這一個Activity實例。

standard模式下的Activity在棧中的表現

在standard模式下的Activity的特性是每次啓動Activity時都會創建新的Activity實例。比如在棧A中已經存在一個standard模式的Activity_A,此時啓動Activity_B,那麼棧中的情況就是B-A。如果再次啓動A,將會重建A的實例,此時棧中情況是A-B-A。同時按下返回鍵時會銷燬棧頂的Activity,然後將下一個Activity提到前臺。如果棧已經不存在Activity實例那麼會立即銷燬棧。

singleTop模式下的Activity在棧中的表現

在singleTop模式下Activity的主要特性是可以複用在棧頂的Activity實例。比如棧中已經存在Activity_A和singleTop模式的Activity_B實例,此時如果再次啓動Activity_B那麼將複用Activity_B的實例,並且Activity_B的生命週期從onNewIntent開始。如果情況顛倒過來,Activity_A的啓動模式是singleTop但Activity_A不位於棧頂,那麼在啓動Activity_A時,將會重新創建Activity_A的實例。此時棧中的情況是A-B-A。

singleTask模式下啓動Activity在棧中的表現

在singleTask模式下Activity主要有可複用的特性,如果棧內存在將要啓動的Activity實例那麼將複用該Activity實例。比如:在前臺的棧中有Activity1和Activity2,在另外一個棧中有Activity3和Activity4,其中Activity3是singleTask啓動模式,如果啓動Activity3,由於棧中存在Activity3的實例,那麼將複用Activity3的實例。同時singleTask模式的Activity實例還有棧頂清除特點,那麼Activity4的實例將被清除。

singleInstance模式下啓動Activity在棧中的表現

singleInstance是一種單實例模式,在這種模式下啓動的Activity的每次都會創建一個新的Activity棧,並且在棧中創建Activity的實例。

Activity的啓動標誌位

Activity的啓動標誌位有很多,這裏分析一些常用的標誌位。設置啓動模式的標誌位:FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_SINGLE_TOP。設置Activity行爲的標誌位:FLAG_ACTIVITY_CLEAR_TOP。

FLAG_ACTIVITY_NEW_TASK:通過在Intent中加入FLAG_ACTIVITY_NEW_TASK啓動Activity時,將在指定的Activity棧中啓動Activity,如果棧中已經存在Activity實例,將複用實例,並且調用onNewIntent方法,這個過程跟singleTask模式下的Activity表現相同。

FLAG_ACTIVITY_SINGLE_TOP:通過在Intent中加入FLAG_ACTIVITY_SINGLE_TOP啓動Activity時,如果棧頂已經存在Activity實例,將複用Activity實例,並且調用onNewIntent方法。否則將重新創建Activity實例。這個過程跟singleTop模式下的Activity表現相同。

FLAG_ACTIVITY_CLEAR_TOP:如果正在啓動的Activity已在當前棧中運行,則不會啓動該活動的新實例,而是銷燬其上的所有其他活動。如果Activity的啓動模式是singleTask,那麼將調用onNewIntent方法。如果Activity的啓動模式是standard那麼會把Activity已經它上面的Activity實例一同銷燬,並且重建Activity實例放入棧頂。

Manifest文件中的標誌位

在Manifest文件中也有定義Activity的行爲的標誌位,但是Intent中的標誌位的優先級高於Manifest文件中的標誌位。

  • lanuchMode:啓動模式標誌位,可以定義Activity的啓動模式。默認爲standard模式。

  • taskAffinity:定義Activity的棧,啓動Activity時會根據定義的棧名稱創建任務棧並且在棧中創建Activity實例。

  • allowTaskReparenting:默認爲false。當設置爲true的時候,在這種情況下Activity可以從啓動它的棧中轉移到它原本所在的應用程序的棧中。比如:有兩個應用A和應用B,應用B擁有一個該屬性設置爲true的Activity。在一個應用A調用這個應用B的Activity,然後在打開應用B時,這個Activity會轉移到這個應用B的棧中。

  • clearTaskOnLaunch:是否每當從主屏幕重新啓動棧時都從中移除根 Activity 之外的所有 Activity —“true”表示始終將任務清除到只剩其根 Activity;“false”表示不做清除。 默認值爲“false”。該屬性只對啓動新棧的 Activity(根 Activity)有意義;對於棧中的所有其他Activity,均忽略該屬性。當值爲“true”時,每次用戶再次啓動棧時,無論用戶最後在棧中正在執行哪個 Activity,也無論用戶是使用返回還是主屏幕按鈕離開,都會將用戶轉至棧的根 Activity。

  • alwaysRetainTaskState:系統是否始終保持 Activity 所在任務的狀態 —“true”表示保持,“false”表示允許系統在特定情況下將任務重置到其初始狀態。 默認值爲“false”。該屬性只對任務的根 Activity 有意義;對於所有其他 Activity,均忽略該屬性。正常情況下,當用戶從主屏幕重新選擇某個任務時,系統會在特定情況下清除該任務(從根 Activity 之上的堆棧中移除所有 Activity)。系統通常會在用戶一段時間(如30分鐘)內未訪問任務時執行此操作。不過,如果該屬性的值是“true”,則無論用戶如何到達任務,將始終返回到最後狀態的任務。 例如,在網絡瀏覽器這類存在大量用戶不願失去的狀態(如多個打開的標籤)的應用中,該屬性會很有用。

總結

上面介紹了Activity的啓動模式、標誌位以及Manifest文件中的標誌位。通過學習這些內容可以掌握Activity在不同設置下的行爲表現,也能通過使用這些設置來實現所需的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章