重溫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實例銷燬。cdn

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

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的實例。it

Activity的啓動標誌位

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

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在不一樣設置下的行爲表現,也能經過使用這些設置來實現所需的功能。

相關文章
相關標籤/搜索