1. 程式人生 > >Activity中的四種啟動模式

Activity中的四種啟動模式

Activity啟動方式有四種,分別是:

standard
singleTop
singleTask
singleInstance


可以根據實際的需求為Activity設定對應的啟動模式,從而可以避免建立大量重複的Activity等問題。

設定Activity的啟動模式,只需要在AndroidManifest.xml裡對應的<activity>標籤設定android:launchMode屬性,例如:

[html] view plaincopy

  1. <activity  
  2.     android:name
    =".A1"  
  3.     android:launchMode="standard" />  


下面是四種模式的作用:

standard
模式,可以不用寫配置。在個模式下,都會默認創建一個新的例。因此,在種模式下,可以有多個相同的例,也允多個相同Activity疊加。

例如:
若我有一個ActivityA1, 上面有一個按可跳A1。那麼如果我點,便會新啟一個Activity A1疊在才的A1之上,再點,又會再新啟一個在它之上……
back鍵會依照棧順序依次退出。



singleTop
可以有多個例,但是不允多個相同Activity疊加。即,如果Activity棧頂候,啟相同的Activity,不會建新的例,而會調用其onNewIntent方法。

例如:
若我有兩個ActivityB1,B2,兩個Activity內容功能完全相同,都有兩個按可以跳到B1或者B2,唯一不同的是B1standardB2singleTop
若我意開啟的B1->B2->B2則實際開啟的B1->B2(後一次意開啟B2實際調用了前一個的onNewIntent方法)
若我意開啟的B1->B2->B1->B2
則實際開啟的序與意的一致,B1->B2->B1->B2


singleTask
只有一個例。在同一個用程式中啟他的候,若Activity不存在,會在當前task建立一個新的例項,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
如果是在用程式中啟它,會新建一個task,並在task中啟動這ActivitysingleTask許別Activity與其在一個task中共存,也就是,如果我在singleTask例中再開啟新的Activity個新的Activity還是會在singleTask例的task中。

例如:
若我的用程式中有三個Activity,C1,C2,C3,三個Activity可互相啟,其中C2singleTask模式,那麼,無我在個程式中如何點,如:C1->C2->C3->C2->C3->C1-C2C1,C3可能存在多個例,但是C2只會存在一個,並且三個Activity都在同一個task裡面。
但是C1->C2->C3->C2->C3->C1-C2這樣的操作實際應該是如下這樣的,因singleTask會把task中在其之上的其它Activity destory掉。
操作:C1->C2          C1->C2->C3          C1->C2->C3->C2            C1->C2->C3->C2->C3->C1             C1->C2->C3->C2->C3->C1-C2
實際:C1->C2          C1->C2->C3          C1->C2                              C1->C2->C3->C1                               C1->C2

若是用程式開啟C2會新啟一個task
Other中有一個activitytaskId200,從它開啟C2C2taskIdI不會200,例如C2taskId201,那麼再從C2開啟C1C3C2C3taskId201
注意:如果此你點home,然後再開啟Other發現這時顯示的肯定會是Other應用中的內容,而不會是我們應用中的C1 C2 C3中的其中一個。


singleInstance
只有一個例,並且例獨立執行在一個task中,task只有例,不允Activity存在。

例如:
程式有三個ActivityD1,D2,D3,三個Activity可互相啟,其中D2singleInstance模式。那麼程式從D1開始執行,假D1taskId200,那麼從D1D2時,D2會新啟一個task,即D2D1不在一個task中執行。假D2taskId201,再從D2D3時,D3taskId200,也就是它被到了D1的任務棧中。

若是在用程式開啟D2,假OthertaskId200,開啟D2D2會新建一個task執行,假它的taskId201,那麼如果這時再從D2D1或者D3又會再建一個task,因此,若操作步驟為other->D2->D1這過程就涉及到了3task了。