標籤:
我們在開發項目的過程中,會涉及到該應用中多個Activity組件之間的跳轉,或者夾帶其它應用的可複用的Activity。例如我們可能希望跳轉到原來某個Activity執行個體,而不是產生大量重複的 Activity。這樣就需要我們為 Activity 配置特定的載入模式,而不是使用預設的載入模式。
設定的位置在AndroidManifest.xml檔案中activity元素的android:launchMode屬性:<activity android:name="ActB" android:launchMode ="singleTask"></activity>
Activity 有四種載入模式
[1] standard 模式
這是預設模式,每次啟用Activity時都會建立Activity執行個體,並放入任務棧中。因此,在這種模式下,可以有多個相同的執行個體,也允許多個相同Activity疊加。
例如:
若我有一個Activity名為A1, 上面有一個按鈕可跳轉到A1。那麼如果我點擊按鈕,便會新啟一個Activity A1疊在剛才的A1之上,再點擊,又會再新啟一個在它之上……
點back鍵會依照棧順序依次退出。
[2] singleTop 模式
如果在任務的棧頂正好存在該Activity的執行個體,就重用該執行個體( 會調用執行個體的 onNewIntent() ),否則就會建立新的執行個體並放入棧頂,即使棧中已經存在該Activity的執行個體,只要不在棧頂,都會建立新的執行個體。
若我有兩個Activity名為B1,B2,兩個Activity內容功能完全相同,都有兩個按鈕可以跳到B1或者B2,唯一不同的是B1為standard,B2為singleTop。
若我意圖開啟的順序為B1->B2->B2,則實際開啟的順序為B1->B2(後一次意圖開啟B2,實際只調用了前一個的onNewIntent方法)
若我意圖開啟的順序為B1->B2->B1->B2,則實際開啟的順序與意圖的一致,為B1->B2->B1->B2。
[3] singleTask 模式
如果在棧中已經有該Activity的執行個體,就重用該執行個體(會調用執行個體的 onNewIntent() )。重用時,會讓該執行個體回到棧頂,因此在它上面的執行個體將會被移出棧。如果棧中不存在該執行個體,將會建立新的執行個體放入棧中。
只有一個執行個體。在同一個應用程式中啟動他的時候,若Activity不存在,則會在當前task建立一個新的執行個體,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
如果是在別的應用程式中啟動它,則會建立一個task,並在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的執行個體中再開啟新的Activity,這個新的Activity還是會在singleTask的執行個體的task中。
[4] singleInstance 模式
在一個新棧中建立該Activity的執行個體,並讓多個應用共用該棧中的該Activity執行個體。一旦該模式的Activity執行個體已經存在於某個棧中,任何應用再啟用該Activity時都會重用該棧中的執行個體( 會調用執行個體的 onNewIntent() )。其效果相當於多個應用共用一個應用,不管誰啟用該 Activity 都會進入同一個應用中。
只有一個執行個體,並且這個執行個體獨立運行在一個task中,這個task只有這個執行個體,不允許有別的Activity存在。
當該模式Activity執行個體在任務棧中建立後,只要該執行個體還在任務棧中,即只要啟用的是該類型的Activity,都會通過調用執行個體的newInstance()方法重用該Activity,此時使用的都是同一個Activity執行個體,它都會處於任務棧的棧頂。此模式一般用於載入較慢的,比較耗效能且不需要每次都重新建立的Activity。
“拿來主義”standard模式。哪裡需要調用我我就去哪裡,可以多次執行個體化,可以幾個相同的Activity重疊。
“拒絕堆疊”singleTop模式。可以多次執行個體化,但是不可以多個相同的Activity重疊,當堆棧的頂部為相同的Activity時,會調用onNewIntent函數。
“獨立門戶”singleTask模式。同一個應用中調用該Activity時,如果該Activity沒有被執行個體化,會在本應用程式的Task內執行個體化,如果已經執行個體化,會將Task中其上的Activity銷毀後,調用onNewIntent;其它應用程式調用該Activity時,如果該Activity沒有被執行個體化,會建立新的Task並執行個體化後入棧,如果已經執行個體化,會銷毀其上的Activity,並調用onNewIntent。一句話,singleTask就是“獨立門戶”,在自己的Task裡,並且啟動時不允許其他Activity淩駕於自己之上。
“孤獨寂寞”singleInstance模式。載入該Activity時如果沒有執行個體化,他會建立新的Task後,執行個體化入棧,如果已經存在,直接調用onNewIntent,該Activity的Task中不允許啟動其它的Activity,任何從該Activity啟動的其他Activity都將被放到其他task中,先檢查是否有本應用的task,沒有的話就建立。
安卓進階-Activity的四種啟動模式