android Activity的啟動模式 作用簡析+demo詳解

許佳佳233發表於2016-03-19

筆者近期做的一個專案用到了Activity的啟動模式,也算是第一次深刻地領會到了其強大與方便。在此也是將自己所得與大家分享,自己寫了一個比較簡易的demo,便於讓大家理解。

此篇部落格意在讓對啟動模式不瞭解的開發者對其有一個較為形象的認識,至於深入探究,筆者還是推薦去看任玉剛前輩所寫的《android開發藝術探索》了。

網上對Activity的啟動模式講解的部落格有很多,但是大部分都需要掌握“棧”的知識,而且很多並不是那麼通俗易懂。筆者打算獨闢蹊徑,一方面通過百度地圖講其作用另一方面通過自己寫的demo演示來講解4種啟動模式

 

作用:

大家對android百度地圖一定非常熟悉,讓我們來看一下下面的圖片:(百度地圖)

        

假設以上3張圖片依次為ABC,筆者得到這三張圖的順序分別為:(好奇的讀者可以自己試試)

開啟A,開啟B,開啟C,開啟B,關閉B,關閉C,回到A,退出程式。(關閉均使用退回鍵)

 

大家可以仔細觀察下A與C兩張圖,不難發現這其實就是同一個Activity,只是通過動態改變佈局使得大家沒有察覺到。

 

那麼問題來了,是如何辦到複用同一個Activity的呢?

無疑就是巧妙地使用了Activity的啟動模式。

按照正常的啟動模式,A開啟B,B再開啟C,應當會有3個Activity,但是很顯然,我們這個test中只有2個Activity,證據就是處在C圖片的時候按退回鍵並沒有跳轉到另外的一個Activity,而是改變了一下佈局,隨後再按退回鍵就會推出程式。

這是一個多麼實用的技能啊!如果會了這個,我們就再也不用老是各種無腦的finish()了!

沒錯,這就是Activity的啟動模式的一個作用了。

(至於是否有其他什麼作用,筆者也還未領悟,歡迎指點)

 

 

demo講解:

首先我們是要知道一共有四種啟動模式:standard(標準模式),singleTop(棧頂複用模式),singleTask(棧內複用模式),singleInstance(單例模式)。

 

新手可能會詢問啟動模式在哪裡設定,筆者在這裡解答一下:

在AndroidManifest裡面,Activity的launchMode屬性中直接可以設定。

 

 

standard:標準模式,這也是系統的預設模式。

每次啟動一個Activity都會重新建立一個新的例項,不管這個例項是否存在。

如圖,筆者依次開啟的Activity是,red,blue,green,green。然後按退回鍵關閉的順序分別為,green,green,blue,red。

 

 

singleTop:棧頂複用模式。

其實解釋很簡單,像上面的standard,我們可以發現,green的Activity是可以再啟動一個green的Activity的,他居然可以自己跳轉到自己,簡直太荒唐了,浪費記憶體。設定了singleTop之後,如果還有“自己跳轉自己”的操作,就不會再建立一個新的Activity了。

如圖,筆者red的Activity設定了singleTop的啟動模式。

從blue的Activity跳轉到了red的Activity,但是當red自己跳轉到自己的時候,就不會再次建立一個新的例項。

 

 

singleTask:棧內複用模式。

這個啟動模式就更方便了,更像是筆者上面所講述的百度地圖的地圖介面的啟動模式。在這種模式下,如果這個Activity已經被建立過了,那麼就不會再次被建立了,而是將之前建立過的那個例項拿過來直接用。

但是如果Activity沒有建立過,那麼就會重新建立一個任務棧,並把新建立的Activity放入。需要理解這個就必須要懂棧的概念了,筆者此處為了讓新手理解,先避開。

如圖,筆者blue的Activity設定了singleTask的啟動模式。

筆者依次打的Activity為,red,blue,green,red,blue。細心的同學已經發現,當最後按返回鍵的時候,直接返回到red之後就退出了Activity,說明只剩下red一個Activity了,這是為何呢?

主要有三點原因:(不懂棧的先只需要理解第一個即可,如有興趣,可以自己再深入理解)

1、第二個blue複用了之前的一個blue

2、建立第一個blue的時候新建了一個任務棧

3、因為singleTask預設具有clearTop的效果,比如是ADBC 4個Activity,倘若D為singleTask,那麼當再次啟動D的時候,就會只留下AD兩個Activity,中間了Activity都被clear了。

此處兩個blue之間的green和red都被clear了。所以開啟第二個blue的時候實際上存在兩個任務棧,第一個任務棧只有一個red,第二個任務棧只有一個blue,所以按返回的時候就回到了red,再按返回就會退出了。

 

 

 

singleInstance:單例模式。

這個模式如果不用“棧”的思想來講真的比較複雜。但是倘若連“棧”都不懂,那麼一般也用不到這兒啟動模式了。

稍微講解一下:在預設的啟動模式下,當我們啟動Activity的時候,系統會建立多個例項並把他們一一放入任務棧,當我們按back鍵,這些Activity就會一一退回。但是在singleInstance中就有所不同了,singleInstance的Activity是直接新建一個任務棧,並且獨自執行在裡面,並且由於棧內複用性的特性,後序均不會建立新的Activity。

 

 

筆者此篇部落格意在讓新手更能理解Activity的啟動模式,可能有多處講地不夠嚴謹,如有前輩不吝指點,不甚感激。

 

示範demo下載地址:http://download.csdn.net/detail/double2hao/9466241

相關文章