android 如何使用LaunchMode
今天,簡單講講android的啟動模式LaunchMode,以及如何根據自己的需要設置LaunchMode。
這個其實也很簡單,我每次使用android studio新建activity時,系統都使用了默認的LaunchMode,即standard模式的LaunchMode。但是自己一直沒有寫博客總結這個功能,主要是沒有必要。直到最近需要做一個功能,即App切換后臺后,再次進入App時,需要跳到主頁,而之前的activity需要自動銷毀,這個功能當時居然不會做,于是在網上查找資料,最終發現LaunchMode可以解決這個問題。這里記錄一下。
?
我們知道默認情況下,當我們多次啟動同一個activity時,系統會創建多個實例并把他們一個個放入任務棧,當我們按back鍵,這些activity又會一個個退出。在講activity的launchmode之前,我們有必要了解下“任務棧(Task Stack)”這個概念。在Android中是使用任務(Task)來管理Activity的,任務就是存放在棧里面的Activity的集合,這個棧就是稱為任務棧。
概念解釋
Task
Task叫做任務,這個簡單,表示我們需要完成的事情,注意,這里我們說的是任務,是個名詞,例如要發短信,那我們的任務就是發送一條短信,僅此而已,再例如教官說:”張三,你去吃屎!”,ok,那張三的任務就是吃屎。
Back Stack
我們常叫做回退棧,或者是任務棧,這個是什么意思呢?上面我們說過,需要完成任務,那我們就需要使用一系列的Activity來完成,例如發短信,則完成該任務需要如下步驟:
以上的任務中涉及到兩個Activity,那這兩個Activity就存放在這個Back Stack中,又因為Back Stack是棧類型的數據結構,所以上面的步驟在這個Back Stack中的活動順序如下:
所以我們明白了,這個回退棧其實就是一個存儲Activity實例的容器,執行每個Task時,先創建一個Back Stack,在Task執行過程中將所使用的Activity都按照FILO的順序以此壓入這個Back Stack,Task目標完成之后,按下返回按鈕時,Back Stack中的Activity按照壓棧相反地的順序以此彈棧,直到棧中沒有Activity實例時,進入Launcher。
由此,我們還可以知道,每個Task和Back Stack是一一對應的關系,一般情況下,每需要執行一個Task時,都至少需要一個Back Stack容器,并且這個容器中都至少會有一個Activity實例。
?
Activity一共有以下四種launchMode:
standard
singleTop
singleTask
singleInstance
?
1.standard
standard是標準啟動模式,也是默認啟動模式,這種情況下,不管當前Back Stack(回退棧)中有沒有要啟動的Activity實例,系統 都會將一個新的Activity實例放在棧頂。假設我們現在有兩個Activity,一個是MainActivity,另外一個是MainActivity2,我們先從MainActivity中啟動MainActivity2,然后在MainActivity2中不斷啟動MainActivity2,看看效果:
?
因為啟動模式是standard,所以每當我們打開一個Activity,就會有一個Activity放在Back Stack棧頂,因此,當我們多次打開MainActivity2之后,我們需要點擊6次回退按鈕才能回到主界面,雖然整個應用只有兩個Activity,但是MainActivity2卻在棧中保存了多份實例。
?
2.singleTop
singleTop就比較有意思了,當一個Activity的啟動模式是singleTop時,如果當前Back Stack棧頂是要啟動的Activity,那么就不會再創建一個Activity實例,而是直接顯示當前棧頂的Activity,同時調用該Activity的onNewIntent()方法;否則就會創建一個新的Activity實例放在棧頂。還是上面那個栗子,改變Activity啟動模式后我們看看有什么不同:
?
這下不管我們啟動MainActivity2多少次,最終都只需點擊兩次后退按鈕就能回到主界面,因為當MainActivity2處于棧頂的時候系統不會再創建新的MainActivity2實例,只是會調用當前實例的onNewIntent方法。
?
2.1應用場景
singleTop的使用場景還是比較多的,比如說我們目前正處在ActivityA上,這時系統忽然接收到一條廣播,這條廣播要求打開ActivityA,那么這個時候就沒有必要再創建一次ActivityA放在棧頂,否則當你退出ActivityA的時候就會發現要連續點擊兩次才能退出ActivityA。還有就是微信的搜索功能,當我們點擊搜索按鈕之后,微信會跳轉到查詢結果頁面,但是在查詢結果頁面,為了我們能夠接著搜索,該頁面上方還有搜索框,如此一來,如果不使用singleTop啟動模式,那么當我們搜索十次之后豈不是要按十次返回鍵才能回到主頁面?實際上肯定不是這樣的,這里就是singleTop使用的最好例子之一。
3.singleTask
當一個Activity啟動模式設置為singleTask時,如果要啟動ActivityA,但是當前Back Stack中已經存在ActivityA只是不在棧頂,這個時候會將ActivityA上面的Activity全部移除,使得ActivityA處于棧頂,同時也會調用ActivityA的onNewIntent方法。換句話說,對于一個Activity而言,整個Back Stack中最多只存在它的一個實例。假如我們有兩個Activity,這兩個Activity的啟動模式都是singleTask,在MainActivity中啟動MainActivity2,在MainActivity2中啟動MainActivity,然后點擊回退按鈕,會出現什么情況?看下圖:
?
我們來簡單分析一下,應用啟動之后,Back Stack中只有一個MainActivity,當MainActivity啟動MainActivity2的時候,這個時候棧中并沒有MainActivity2,所以會創建一個MainActivity2的實例放在棧頂,當MainActivity2啟動MainActivity時候,由于棧中已經有了MainActivity,只是不在棧頂,這個時候系統會將棧頂了MainActivity2移除(調用MainActivity2的生命周期方法),然后MainActivity就會處于棧頂,這個時候棧中只有一個Activity,所以點擊一次回退按鈕就能回到手機主界面。
3.1應用場景
singleTask一般用在應用程序的主界面,對于大部分應用,當我們在主界面點擊回退按鈕的時候都是退出應用,那么那么當我們第一次進入主界面之后,主界面位于棧底,以后不管我們打開了多少個Activity,只要我們再次回到主界面,都應該使用將主界面Activity上所有的Activity移除的方式來讓主界面Activity處于棧頂,而不是往棧頂新加一個主界面Activity的實例(說到這里小伙伴們應該知道怎么樣退出一個App了吧)。
?
.singleInstance
singleInstance總的來說用的還是比較少見,singleInstance和singleTask比較像,不同的是當我們將一個Activity啟動模式設置為singleInstance時,當啟動這個Activity時,系統會把這個Activity放在一個新的Task中,然后如果有其他應用要使用也從這個新的Task中調用該Activity。注意這里有了一個很大的不同就是系統中有了兩個Task,假如我們有兩個Activity,MainActivity和MainActivity2,MainActivity的啟動模式為默認模式,MainActivity2的啟動模式為singleInstance,當我們從MainActivity啟動MainActivity2之后,然后點擊home鍵,再從任務管理器回到MainActivity2,然后點擊回退按鈕,看看會出現什么情況:
?
當我們通過任務管理器回到MainActivity2的時候,點擊一下回退按鈕竟然沒有回到MainActivity,而是直接退出應用,這是因為MainActivity2所在的棧中就它一個Activity,那么點擊回退按鈕當然會退出當前應用。
?
簡單講講,其實standard模式就是每次跳轉activity都新建activity,然后將之前的activity存入Stack棧頂,退出時從Stack棧頂取activity。singleTop模式基本和standard模式一樣,只是如果跳轉的activity已經在Stack棧頂,就不會重新創建activity,而是復用之前Stack棧頂的activity,并且回調activity的onNewIntent()方法,但是它的onCreate()、onStart()方法不會被調用。singleTask模式每次跳轉activity時先看Stack棧是否存在跳轉的activity,如果存在,則直接復用Stack棧的activity,系統會調用它的onNewIntent()方法。如果不存在,則新建activity,這是和standard模式一樣。singleInstance模式比較特別,當跳轉到singleInstance啟動模式的activity時,系統會重新創建Stack棧,這里主要一點,singleInstance啟動模式存入activity的Stack棧和直接的activity的Stack棧是不一樣的,如何此時將singleInstance啟動模式的activity存入Stack棧,那么按返回鍵是不能返回到之前的activity的,因為兩個activity的Stack棧是不一樣的。返回鍵的功能其實就是將相同Stack棧頂的activity取出,如果相同Stack棧沒有activity,則退出App。
?
這里,大家應該已經知道了我開始提出的問題:App切換后臺后,再次進入App時必須跳轉到主界面,而之前的activity必須銷毀,這個功能怎么做?其實就是將主界面的activity的launchmode設置為singleTask。因為當我們啟動App時,首先跳轉的是主界面,所以MainActivity位于Stack棧的棧底,其他界面都是通過MainActivity跳轉的,所以當其他界面跳轉到MainActivity時,由于棧中已經有了MainActivity,只是不在棧頂,這個時候系統會將MainActivity之上的activity移除,也就是銷毀了activity。然后MainActivity就會處于棧頂,這個時候棧中只有一個Activity。
?
android 如何使用LaunchMode就講完了。
?
就這么簡單。
總結
以上是生活随笔為你收集整理的android 如何使用LaunchMode的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android studio如何生成混淆
- 下一篇: android WPS如何绘制垂直和水平