天天看點

Android Activity啟動模式

在android的聯機文檔中,有對activity的簡單介紹,現在通過編寫代碼對activity的啟動模式做一個深入的了解。

在配置檔案androidmanifest.xml中,activity元素的android:launchmode屬性用來配置對應activity的啟動模式,目前有以下四種啟動模式:

1.standard

2.singletop

3.singletask

4.singleinstance

如果不對activity設定啟動模式,預設就是standard模式

一、standard

請看以下代碼,實作了一個activity :

運作之,請看下圖:

Android Activity啟動模式

點選button後,注意看第一行的textview

Android Activity啟動模式

由此可知,生成了新的a_activity對象,這時我們按回退鍵,就會依次回到之前的activity。點選button的過程就是壓棧的過程,在standard模式下,就會不斷生成新的activity對象

二、singletop

singletop和standard模式都會将intent發送給新的activity執行個體,不同的是,如果建立intent的時候棧頂有要建立的singletop模式下的activity執行個體,則将intent發送給該執行個體,不會再建立activity的新執行個體。

還是使用之前的代碼,隻是設定a_activity的啟動模式為singletop:android:launchmode="singletop",運作之,請看下圖:

Android Activity啟動模式

這個時候我們無論點選多少次button,textview都顯示同一個activity執行個體,按回退鍵時會直接退出程式,表明在singletop模式下,如果在棧頂存在intent中那個目标activity的執行個體,就不會建立新的執行個體,而直接使用棧頂的對象,對于資源有限的移動裝置來說,也是有實際意義的。

如果是在不同activity之間跳轉,就會跟standard模式的情形一樣,請看下面代碼:

運作後,如下圖:

Android Activity啟動模式

點選button後:

Android Activity啟動模式

再點選button後:

Android Activity啟動模式

這樣每次都會建立目标activity的新執行個體,因為在跳轉時,處于棧頂的對象不是目标activity的執行個體

三、singletask

singletask模式隻能建立一個執行個體,當發送一個intent,目标activity為singletask模式時,系統會檢查棧裡面是否已經有該activity的執行個體,如果有就直接将intent發送給它,還是使用(二)中的代碼,将a_activity啟動模式設定為singletask,b_activity啟動模式設定為standard,啟動後如下圖:

Android Activity啟動模式
Android Activity啟動模式

繼續點選button:

Android Activity啟動模式

由此可知,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模式,啟動後:

Android Activity啟動模式
Android Activity啟動模式

表明啟動了新的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

Android Activity啟動模式

(2)singletask

Android Activity啟動模式

可以将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中隻有它)