在android的聯機文檔中,有對activity的簡單介紹,現在通過編寫代碼對activity的啟動模式做一個深入的了解。
在配置檔案androidmanifest.xml中,activity元素的android:launchmode屬性用來配置對應activity的啟動模式,目前有以下四種啟動模式:
1.standard
2.singletop
3.singletask
4.singleinstance
如果不對activity設定啟動模式,預設就是standard模式
一、standard
請看以下代碼,實作了一個activity :
運作之,請看下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauYzM2EGZlNTOkN2NxUzLcJGZlFzLchjMvwFNwMTMwIzLcVWbvh2Lcd3d39CXuNmLl9WZuETYvw1LcpDc0RHaiojIsJye.jpg)
點選button後,注意看第一行的textview
由此可知,生成了新的a_activity對象,這時我們按回退鍵,就會依次回到之前的activity。點選button的過程就是壓棧的過程,在standard模式下,就會不斷生成新的activity對象
二、singletop
singletop和standard模式都會将intent發送給新的activity執行個體,不同的是,如果建立intent的時候棧頂有要建立的singletop模式下的activity執行個體,則将intent發送給該執行個體,不會再建立activity的新執行個體。
還是使用之前的代碼,隻是設定a_activity的啟動模式為singletop:android:launchmode="singletop",運作之,請看下圖:
這個時候我們無論點選多少次button,textview都顯示同一個activity執行個體,按回退鍵時會直接退出程式,表明在singletop模式下,如果在棧頂存在intent中那個目标activity的執行個體,就不會建立新的執行個體,而直接使用棧頂的對象,對于資源有限的移動裝置來說,也是有實際意義的。
如果是在不同activity之間跳轉,就會跟standard模式的情形一樣,請看下面代碼:
運作後,如下圖:
點選button後:
再點選button後:
這樣每次都會建立目标activity的新執行個體,因為在跳轉時,處于棧頂的對象不是目标activity的執行個體
三、singletask
singletask模式隻能建立一個執行個體,當發送一個intent,目标activity為singletask模式時,系統會檢查棧裡面是否已經有該activity的執行個體,如果有就直接将intent發送給它,還是使用(二)中的代碼,将a_activity啟動模式設定為singletask,b_activity啟動模式設定為standard,啟動後如下圖:
繼續點選button:
由此可知,singletask模式的a_activity在棧中隻有一個執行個體,可以被重複使用
并且,如果收到intent生成一個新執行個體,那麼使用者可以通過回退鍵回到上一個狀态,如果是已經存在的一個activity來處理這個intent的話,就無法通過回退鍵回到上一個狀态(對singleinstance同樣适用)
,比如剛才最後一步如果再按回退鍵,就會直接退出程式,而不會回到上一步的狀态。
四、singleinstance
這個模式下的activity在一個單獨的task棧中,這個棧也隻能包含一個activity的執行個體,将上面代碼稍微改動一下,顯示taskid:
a_activity
中:textview.settext(this.gettaskid()+"");
b_activity
另外将b_activity
設定為singleinstance模式,a_activity 設定為standard模式,啟動後:
表明啟動了新的task
總結四個模式的不同:
1、intent的目标activity由哪個task持有
standard與singletop的activity所在task,與收到的intent的發送者所在task相同,除非intent包括參數flag_activity_new_task,該參數會啟動activity到新的task中;singletask和singleinstance總是把activity作為一個task的根元素,它們不會被啟動到其他task裡
2、是否允許activity的多個執行個體
standard與singletop可以被執行個體化多次,可以存在不同task中,并且一個task可以包括同一activity的多個執行個體
singletask與singleinstance則在同一個task中隻能允許activity的一個執行個體,并且是task的根元素
3、在同一個task棧中,是否允許其他activity的執行個體存在
singleinstance單獨在一個task中,其他啟動模式允許不同activity的執行個體存在
4、是否每次生成新執行個體接收intent
standard每次啟動都會生成新執行個體
singletop的activity如果在task的棧頂的話,則不生成新的activity執行個體,直接使用該執行個體,否則,就要生成新的執行個體
singleinstance在所在棧中是唯一的activity,它每次都會被重用
singletask如果task棧中有該模式的activity,就不生成新的activity執行個體,直接使用該執行個體,否則,就要生成新的執行個體
也看過一些自己找的,會有配圖:
(1)standard
(2)singletask
可以将taska
taskb了解為兩個應用,比如taska是你目前的應用,taskb是預設浏覽器。
當到了taskb中後,按傳回鍵,需要先在taskb中傳回到root,然後才能傳回到taska。
總結成以下幾句:
standard
每次都會建立,每個task都可以有,且每個task都可以有多個執行個體(每個task都可以有,且可以有多個)
singletop
目前執行個體如果在棧頂,就不建立執行個體,調用其onnewintent。 如不在棧頂,則建立執行個體
(每個task都可以有,且可以有多個,在棧頂時可複用)
singletask
建立一個task,如果已經有其他的task并且包含該執行個體,那就直接調用那個task的執行個體。(隻有一個task中會有)
singleinstance
建立一個task,且在該task中隻有它的唯一一個執行個體。 (隻有一個task會有,且該task中隻有它)