Android学习之基础知识四-Activity活动7讲(活动的启动模式)
在實際的項目開發中,我們需要根據特定的需求為每個活動指定恰當的啟動模式。Activity的啟動模式一共有4種:standard、singleTop、singleTask、singleInstance.?可以在AndroidManifest.xml中通過給<activity>標簽指定android:launchMode屬性來選擇啟動模式
一、standard
standard模式是活動默認的啟動模式,在該模式下,每啟動一個活動都會創建該活動的一個新的實例并放在棧頂的位置,而不在乎返回棧里面是否已經存在該活動。
standard模式的示意圖:
Java代碼:
?
效果:點擊三次button1按鈕,都會打開FirstActivity活動界面,查看Logcat日志,可以看到創建了三個FirstActivity活動的實例,退出該活動界面需要點擊三次Back鍵才退出。
?
?二、singleTop
? singleTop啟動模式的工作原理:當每次啟動活動時,系統會先在返回棧中檢查棧頂的活動是不是當前正在啟動的活動,如果是當前正在啟動的活動,那么就會直接使用棧頂的這個實例,不會再創建新的實例,如果不是當前正在啟動的活動,那么才會創建一個新的活動實例。
需要注意的是:如果棧內已經存在當前正在啟動的活動,還是會重新創建一個新的活動實例。
singleTop模式的示意圖:
情況一:正在創建的活動位于棧頂
?Java代碼:
修改AndroidManifest.xml中FirstActivity活動的啟動模式:
?
運行程序:
?
在程序運行成功的時候,會創建一個FirstActivity活動的實例,然后我們點擊button1,不管點擊多少次,從Logcat日志中我們可以看到,除了剛開始運行程序的時候創建了一個實例外,沒有再創建新的實例。
按Back鍵退出程序也只需要按一次Back鍵就行了。
?
情況二:返回棧內部存在當前正在啟動的活動
?兩個活動:FirstActivity、SecondActivity
?
運行程序:因為啟動了FirstActivity活動,所以此時只創建了一個FirstActivity活動的實例
點擊button1按鈕進入SecondActivity活動界面:創建了SecondActivity活動的實例
?
點擊button2按鈕,返回到FirstActivity活動界面:此時又創建了一個FirstActivity活動的實例。
?
經過 上面整個過程,返回棧中總共存在三個活動的實例,從棧底到棧頂依次是:FirstActivity--->SecondActivity--->FirstActivity
此時點擊Back鍵,活動的運行順序是:FirstActivity?Back--->SecondActivity?Back--->FirstActivity?Back--->程序關閉
第一次點擊Back:
?
第二次點擊Back:
第三次點擊Back:結束程序
?
三、singleTask
singleTask啟動模式:每次啟動一個活動時,系統會先檢查返回棧中是否存在該活動,如果存在該活動,那么就會直接使用該實例,不會再創建一個該活動的實例,并使該活動之上的所有活動都出棧。如果不存在該活動,那么就會創建一個新的活動實例。
singleTask模式示意圖:
示例:
第一步:將FirstActivity活動的啟動模式設為singleTask模式
第二步:在FirstActivity活動中添加onRestart()方法,并打印日志
第三步:在SecondActivity活動中添加onDestroy()方法,并打印日志
第四步:運行程序,進入FirstActivity活動--->點擊button1按鈕進入SecondActivity活動界面--->點擊button2按鈕返回到FirstActivity
第五步:看Logcat日志,從日志中可以看到,運行程序的時候,只創建了FirstActivity活動的一個實例,當啟動SecondActivity活動時,又創建了SecondActivity活動的一個實例,此時兩個實例在返回棧中的位置是:FirstActivity活動的實例在棧底,SecondActivity活動的實例在棧頂。當點擊button2按鈕啟動FirstACtivity活動時,此時SecondActivity活動實例被移除棧頂,因此調用了SecondActivity活動的onDestroy()方法,而FirstActivity活動從棧底位置到了棧頂位置,這個時候并沒有再創建FirstActivity活動的實例,只是重新返回到了該活動,從不可見變為了可見狀態,因此此時FirstActivity是調用了onReStart()方法,而沒有調用初始化方法onCreate()方法。
?
四、singleInstance
場景:假設我們程序中的一個活動允許其他程序調用,如果我們想實現其他程序和我們的程序能夠共享這個活動的實例,那么應該怎么實現呢?每個用于程序都有自己的返回棧,同一個活動在不同的返回棧中必然是創建了一個新的活動實例的,而我們共享的這個活動在一個返回棧中,共享同一個實例。
? singleInstance啟動模式:singleInstance啟動模式與其它三種啟動模式不同,它是通過創建一個新的返回棧來管理活動的(如果singleTask模式指定了不同的taskAffinity,也會啟動一個新的返回棧),在這種模式下,會有一個單獨的返回棧來管理活動,不管哪個應用程序來訪問這個活動,都共用同一個返回棧,也就解決了共享活動實例的問題。
singleInstance模式的示意圖:
示例:
第一步:將SecondActivity活動的啟動模式設置為singleInstance
第二步:創建活動后,打印出FirstActivity活動、SecondActivity活動、ThirdActivity活動所在的返回棧
第三步:運行程序,進入FirstActivity活動界面--->點擊按鈕,進入SecondActivity界面--->點擊按鈕進入ThirdACtivity界面,打開日志,從日志中我們可以發現FirstActivity活動與SecondActivity活動都在返回棧16中,而SecondActivity活動在返回棧17中,也就是說在啟動SecondActivity活動的時候,系統重新創建了一個返回棧17專門來管理活動SecondActivity.
第四步:此時在ThirdActivity活動界面點擊Back鍵,就會直接回到了FirstActivity活動界面,這是因為返回棧16是我們運行程序的返回棧,在這個返回棧中只有FirstActivity和ThirdActivity兩個活動,FirstActivity活動位于棧底,ThirdActivity活動位于棧頂,當點擊Back鍵時,ThirdActivity活動出棧,FirstActivity活動就位于棧頂位置了,所以此時顯示的是FirstActivity活動,而不是SecondActivity活動,緊接著再點擊Back鍵,FirstActivity活動出棧,這時候就返回到了SecondActivity活動的界面,這是因為返回棧16已經空了,只剩下返回棧17,而返回棧17中只有SecondActivity一個活動,因此顯示的就是SecondActivity活動的界面,然后再點擊Back鍵,系統退出。
五、活動啟動模式總結
1、standard:系統默認啟動方式,所有活動在一個返回棧,每啟動一個活動就會在返回棧的棧頂創建一個該活動的實例,與返回棧中有無該活動的實例無關。
2、singleTop:所有活動都在一個返回棧,每啟動一個活動,系統會先檢查返回棧的棧頂的活動是不是當前啟動的活動,如果是,就直接使用,如果不是,就會創建一個新的活動實例,與棧頂以下是否存在該活動實例無關。
3、singleTask:所有活動都在一個返回棧,每啟動一個活動,系統會先檢查返回棧里面是否存在了該實例,如果存在,那么會把該實例上面的所有活動出棧,然后自己位于棧頂位置,如果不存在,那么會創建新的活動實例位于棧頂。(如果指定了不同的taskAffinity,也會啟動一個新的返回棧)
4、singleInstance:通過創建一個新的返回棧來管理活動,可以達到不同的應用程序共享同一個活動的目的。
轉載于:https://www.cnblogs.com/hh8888-log/p/9878722.html
總結
以上是生活随笔為你收集整理的Android学习之基础知识四-Activity活动7讲(活动的启动模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS中 map, filter, som
- 下一篇: Android事件分发机制:基础篇:最全