Android系統采用任務棧的方式來管理Activity實例。
棧是后進先出的數據結構。通常一個應用程序對應一個任務棧,默認情況下,每啟動一個Activity都會入棧,處于棧頂位置。用戶操作的永遠都是棧頂的Activity。
Activity可以層疊擺放,每啟動一個新的Activity都會覆蓋在原Activity之上(入棧),單擊返回按鈕,最上面的Activity會被銷毀,下面的Activity重新顯示。
Activity有4種啟動模式:
1、standard模式
上面介紹的模式就是standard模式。standard模式是Activity默認的啟動模式。每啟動一個Activity就在棧頂創建一個新的實例。
鬧鐘通常采用此種模式。
2、singleTop模式
如果有時候satndard模式并不合理,比如當前Activity已處于棧頂,再次啟動此Activity會重新創建實例,不會直接復用。
singleTop顧名思義,棧頂單例。
將某個Activity的啟動模式設置為singleTop,啟動此Activity時,會先檢查棧頂是否是此Activity的實例,如果是,則直接復用,如果不是,才創建實例。
瀏覽器的書簽通常采用此種模式。
3、singleTask模式
singleTop模式有一定的缺陷,當棧中有此Activity的實例,但未處于棧頂時,仍會創建實例,棧中可能會存在此Activity的多個實例。
singleTask,顧名思義,任務棧中只有一個實例。
啟動某個Activity時,會先檢查任務棧中是否有該Activity的實例,有就直接復用(把前面所有的Activity出棧),沒有才創建并入棧。
瀏覽器的主界面通常采用此模式。
4、singleInstance模式
會啟動一個新的任務棧來管理當前程序中singleInstance模式啟動的Activity,在Android系統中,該Activity只有一個實例。
這種模式主要是為了,在不同程序間共享同一個Activity實例。
啟動Activity時,若Android系統中不存在該Activity的實例,則創建并入棧;若已存在,不管此實例位于哪個程序的哪個任務棧中,系統都會把該任務棧轉移到前臺,顯示該實例。
來電界面通常使用此模式。
可在AndroidManifest.xml文件對應的 元素中用 launchMode屬性 指定啟動模式:
1
3 android:label="@string/title_activity_2"
4 android:theme="@style/AppTheme.NoActionBar"
5 android:launchMode="singleTask">
6
缺省時默認為standard模式。