筆者近期做的一個項目用到了Activity的啟動模式,也算是第一次深刻地領(lǐng)會到了其強(qiáng)大與方便。在此也是將自己所得與大家分享,自己寫了一個比較簡易的demo,便于讓大家理解。 此篇博客意在讓對啟動模式不了解的開發(fā)者對其有一個較為形象的認(rèn)識,至于深入探究,筆者還是推薦去看任玉剛前輩所寫的《Android開發(fā)藝術(shù)探索》了。 網(wǎng)上對Activity的啟動模式講解的博客有很多,但是大部分都需要掌握“?!钡闹R,而且很多并不是那么通俗易懂。筆者打算獨辟蹊徑,一方面通過百度地圖講其作用,另一方面通過自己寫的demo演示來講解4種啟動模式。
作用: 大家對android百度地圖一定非常熟悉,讓我們來看一下下面的圖片:(百度地圖) 假設(shè)以上3張圖片依次為ABC,筆者得到這三張圖的順序分別為:(好奇的讀者可以自己試試) 打開A,打開B,打開C,打開B,關(guān)閉B,關(guān)閉C,回到A,退出程序。(關(guān)閉均使用退回鍵)
大家可以仔細(xì)觀察下A與C兩張圖,不難發(fā)現(xiàn)這其實就是同一個Activity,只是通過動態(tài)改變布局使得大家沒有察覺到。
那么問題來了,是如何辦到復(fù)用同一個Activity的呢? 無疑就是巧妙地使用了Activity的啟動模式。 按照正常的啟動模式,A打開B,B再打開C,應(yīng)當(dāng)會有3個Activity,但是很顯然,我們這個test中只有2個Activity,證據(jù)就是處在C圖片的時候按退回鍵并沒有跳轉(zhuǎn)到另外的一個Activity,而是改變了一下布局,隨后再按退回鍵就會推出程序。 這是一個多么實用的技能??!如果會了這個,我們就再也不用老是各種無腦的finish()了! 沒錯,這就是Activity的啟動模式的一個作用了。 (至于是否有其他什么作用,筆者也還未領(lǐng)悟,歡迎指點)
demo講解: 首先我們是要知道一共有四種啟動模式:standard(標(biāo)準(zhǔn)模式),singleTop(棧頂復(fù)用模式),singleTask(棧內(nèi)復(fù)用模式),singleInstance(單例模式)。
新手可能會詢問啟動模式在哪里設(shè)置,筆者在這里解答一下: 在AndroidManifest里面,Activity的launchMode屬性中直接可以設(shè)置。
standard:標(biāo)準(zhǔn)模式,這也是系統(tǒng)的默認(rèn)模式。 每次啟動一個Activity都會重新創(chuàng)建一個新的實例,不管這個實例是否存在。
如圖,筆者依次打開的Activity是,red,blue,green,green。然后按退回鍵關(guān)閉的順序分別為,green,green,blue,red。
singleTop:棧頂復(fù)用模式。 其實解釋很簡單,像上面的standard,我們可以發(fā)現(xiàn),green的Activity是可以再啟動一個green的Activity的,他居然可以自己跳轉(zhuǎn)到自己,簡直太荒唐了,浪費(fèi)內(nèi)存。設(shè)置了singleTop之后,如果還有“自己跳轉(zhuǎn)自己”的操作,就不會再創(chuàng)建一個新的Activity了。
如圖,筆者red的Activity設(shè)置了singleTop的啟動模式。 從blue的Activity跳轉(zhuǎn)到了red的Activity,但是當(dāng)red自己跳轉(zhuǎn)到自己的時候,就不會再次創(chuàng)建一個新的實例。
singleTask:棧內(nèi)復(fù)用模式。 這個啟動模式就更方便了,更像是筆者上面所講述的百度地圖的地圖界面的啟動模式。在這種模式下,如果這個Activity已經(jīng)被創(chuàng)建過了,那么就不會再次被創(chuàng)建了,而是將之前創(chuàng)建過的那個實例拿過來直接用。 但是如果Activity沒有創(chuàng)建過,那么就會重新創(chuàng)建一個任務(wù)棧,并把新創(chuàng)建的Activity放入。需要理解這個就必須要懂棧的概念了,筆者此處為了讓新手理解,先避開。
如圖,筆者blue的Activity設(shè)置了singleTask的啟動模式。 筆者依次打的Activity為,red,blue,green,red,blue。細(xì)心的同學(xué)已經(jīng)發(fā)現(xiàn),當(dāng)最后按返回鍵的時候,直接返回到red之后就退出了Activity,說明只剩下red一個Activity了,這是為何呢? 主要有三點原因:(不懂棧的先只需要理解第一個即可,如有興趣,可以自己再深入理解) 1、第二個blue復(fù)用了之前的一個blue 2、創(chuàng)建第一個blue的時候新建了一個任務(wù)棧 3、因為singleTask默認(rèn)具有clearTop的效果,比如是ADBC 4個Activity,倘若D為singleTask,那么當(dāng)再次啟動D的時候,就會只留下AD兩個Activity,中間了Activity都被clear了。 此處兩個blue之間的green和red都被clear了。所以打開第二個blue的時候?qū)嶋H上存在兩個任務(wù)棧,第一個任務(wù)棧只有一個red,第二個任務(wù)棧只有一個blue,所以按返回的時候就回到了red,再按返回就會退出了。
singleInstance:單例模式。 這個模式如果不用“棧”的思想來講真的比較復(fù)雜。但是倘若連“?!倍疾欢?,那么一般也用不到這兒啟動模式了。 稍微講解一下:在默認(rèn)的啟動模式下,當(dāng)我們啟動Activity的時候,系統(tǒng)會創(chuàng)建多個實例并把他們一一放入任務(wù)棧,當(dāng)我們按back鍵,這些Activity就會一一退回。但是在singleInstance中就有所不同了,singleInstance的Activity是直接新建一個任務(wù)棧,并且獨自運(yùn)行在里面,并且由于棧內(nèi)復(fù)用性的特性,后序均不會創(chuàng)建新的Activity。
筆者此篇博客意在讓新手更能理解Activity的啟動模式,可能有多處講地不夠嚴(yán)謹(jǐn),如有前輩不吝指點,不甚感激。
示范demo下載地址:http://download.csdn.net/detail/double2hao/9466241 |
|