1. 程式人生 > >Androidactivity四種啟動模式

Androidactivity四種啟動模式

Activity中四大啟動模式

在AndroidManifest.xml中 ,有一個預設的activity 在它裡面可以設定activity啟動模式, android:launchMode="“ ,該屬性用於配置Activity的載入模式,該屬性支援4中屬性 每不同的模式出現不同的效果,下面詳解啟動模式。

standard:標準模式,預設載入模式

singleTop:Task頂單例模式
singleTask:Task內單例模式
singleInstance:全域性單例模式

 

1 Activity為什麼要用指定模式??

首先介紹下Android對Activity的管理:Android採用Task來管理多個Activity,當我們啟動一個Activity時,系統就會建立一個Task,然後啟動這個Activity的入口。


Android並未給Task提供API,只能通過呼叫Activity的getTaskId()方法獲取它所在的Task的ID,我們可以把Task理解為Activity 棧,Task以棧來管理Activity。

 

2.四大啟動模式的理解

 

standard載入模式

每次通過這種模式啟動Activity時,Android總會為啟動的Activity建立一個新的例項,並將該Activity新增到當前Task棧中,這種模式不會建立新的Task,只是將新
Activity新增到原有的Task 中

例如:若我有一個Activity名為MainActivity, 上面有一個按鈕可跳轉到

MainActivity。那麼如果我點選按鈕,便會新啟一個MainActivity疊在剛才的MainActivity之上,再點選,又會再新啟一個在它之上……點back鍵會依照棧順序依次退出。

 

 

singleTop模式

 

如果在任務的棧頂正好存在該Activity的例項, 就重用該例項,否者就會建立新的例項並放入棧頂(即使棧中已經存在該Activity例項,只要不在棧頂,都會建立實例)。 為了防止出現一些奇怪的使用者體驗.推薦使用單一頂部模式.整個任務棧可以有多個例項存在.

例如:若我有兩個Activity名為MainActivity,SecondActivity,兩個Activity內容功能完全相同,都有兩個按鈕可以跳到MainActivity或者SecondActivity,唯一不同的是MainActivity為standard,SecondActivity為singleTop。


若我意圖開啟的順序為MainActivity->SecondActivity->SecondActivity,則實際開啟的順序為MainActivity->SecondActivity
若我意圖開啟的順序為MainActivity->SecondActivity->MainActivity->SecondActivity,則實際開啟的順序與意圖的一致,為MainActivity->SecondActivity->MainActivity->SecondActivity。

singleTask模式


被啟動的Activity在同一個Task內只有一個Activity例項,具體分為如下三種情況:


<1>.如果啟動的目標Activity不存在Task棧中,系統將會建立一個目標Activity例項,並將它加入到Task棧頂


<2>.如果啟動的目標Activity已存在Task棧頂,重用該例項


<3>.若果啟動的目標Activity已存在但沒有位於Task棧頂,系統將會把該目標Activity上面的所有Activity移除Task棧,使該Activity置於Task棧頂

 

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

 

應用場景: 如果一個Activity非常消耗記憶體和cpu資源,建議把這個Activity做成singletask的模式.瀏覽器的browserActivity

 

singleInstance模式

這種載入模式下,無論從哪個Task中啟動目標Activity,只會建立一個目標Activity例項,並會使用一個全新的Task棧來裝載該Activity例項。具體可分為兩種情況:


<1>.如果建立的目標Activity不存在,系統先會建立一個全新的Task,接著建立一個Activity例項,然後將該目標Activity加入到新的Task棧頂


<2>.如果建立的目標Activity已經存在,無論在哪個Task棧中,系統將會把Activity所在的棧置於前臺。

例如:
程式有三個ActivityD1,D2,D3,三個Activity可互相啟動,其中D2為singleInstance模式。那麼程式從D1開始執行,假設D1的taskId為200,那麼從D1啟動D2時,D2會新啟動一個task,即D2與D1不在一個task中執行。假設D2的taskId為201,再從D2啟動D3時,D3的taskId為200,也就是說它被壓到了D1啟動的任務棧中。

注意:採用singleInstance載入模式的Activity總是位於Task棧頂,並且Activity所在的Task棧只包含該Activity。

 整個手機作業系統只有一個例項存在,並且是執行在自己單獨的任務棧裡面.
>通話介面的Activity