


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、全面解析Activity 的4種啟動模式說到An droid的啟動模式,首先來看一個實(shí)際的業(yè)務(wù)場景。我之前在公司實(shí)習(xí)的時候, 我所在的部門只負(fù)責(zé)一個品類國際機(jī)票,那用戶從機(jī)票首頁開始搜索機(jī)票到最終完成訂單并支付大致分為以下幾個流程實(shí)際流程因?yàn)榭紤]的問題比較多,所以要比這稍微復(fù)雜 些:1. 用戶在機(jī)票首頁確認(rèn)好出發(fā)、到達(dá)目的地、日期與人數(shù)后,就可以點(diǎn)擊“搜索'進(jìn) 入到搜索結(jié)果頁2. 用戶根據(jù)意愿選擇相應(yīng)航班并點(diǎn)擊進(jìn)入確認(rèn)訂單頁3. 用戶確認(rèn)好訂單容點(diǎn)擊下單,開始支付,支付完成跳支付完成頁4. 用戶可以選擇回到首頁,或者去公共訂單系統(tǒng)查看訂單詳情這屬于公共局部,不 在我們討論的圍了經(jīng)過上面
2、4個步驟整個購票流程就算完畢了。但是,這里有個問題,就是用戶從首頁到最后的支付完成頁之間經(jīng)歷了這么多的Activity ,那用戶完成了支付后想回到首頁是不是要一層一層的往回退才行?如果是這樣的話,那就太不人性化了,那怎樣才能在完成支付后一鍵回到首頁呢?有人可能會說,那就直接從支付完成頁跳轉(zhuǎn)到首頁不就可以了嗎?這樣當(dāng)然是可以的,但是這樣做那之前翻開的那么多Activity 怎么辦呢?難道就讓它們待在Activity 任務(wù)棧中嗎?這樣豈不是太浪費(fèi)存了!請看我畫的示意圖:L首頁2-搜索結(jié)果蟲孔確認(rèn)訂單貢4支付完成頁2. 搜黨結(jié)果眞'M嗚認(rèn)訂單頁4*支付完成頁Task HlTask #1如上圖
3、所示,如果我們在支付完成之后啟動首頁Activity 那頁面1-頁面5之間的所有Activity 對用戶來說都是無用的,并且占用的存,極浪費(fèi)這本來可能就很緊的An droid存資源。那有沒有一些優(yōu)雅的方式來解決這個問題呢?我們可以想象一下,有沒有可能在從頁面4跳轉(zhuǎn)首頁的時候把原來處于首頁之上的所有Activity全部干掉呢?這樣不就剛好解決了我們剛剛所說浪費(fèi)資源的問題了嗎?就像以下圖一樣:1.首頁I窕首頁乙搜素結(jié)果訂I;*,!*3. 確認(rèn)訂單頁4支付芫成頁Tasl #1Tft5k#l很顯然,無論從用戶體驗(yàn)的角度還是從存優(yōu)化的角度來看第二種方式都是最為優(yōu)雅的。那怎么實(shí)現(xiàn)這種需求呢?有人可能會說,
4、可以將任務(wù)棧中頁面1之上的所有Activity一層一層地執(zhí)行finish()方法銷毀掉,這樣就可以回退到頁面1。這樣確實(shí)是可行的,但是有個問題:如果希望從頁面4跳轉(zhuǎn)到頁面1時傳遞一些數(shù)據(jù)回去,比方說訂單號、支付完成 等信息,還需要在 finish()執(zhí)行前執(zhí)行 setResult(int resultCode, Intent intent)將要往回傳遞的數(shù)據(jù)放在In te nt里面。這樣做其實(shí)是有風(fēng)險的,因?yàn)锳n droid系統(tǒng)并不保證Activity任務(wù)棧中那些不可見的Activity的狀態(tài)是一直被保存著的,如果出現(xiàn)系統(tǒng)存缺乏的情況,An droid系統(tǒng)是可以回收那些處于不可見狀態(tài)的Acti
5、vity 的。也就是說,一旦中間有一 Activity被銷毀了,那這個傳遞鏈就失去成效了。那應(yīng)該怎么辦呢?別著急,Google的An droid工程師早就已經(jīng)為我們想到這種需求了。那應(yīng)該怎么做呢?其實(shí)就是通過設(shè)置Activity的啟動模式來實(shí)現(xiàn)。好,問題拋出了,下面讓我們一步一步來看。Activity有哪幾種啟動模式?Activity一共有4種啟動模式,分別是I .standard n . singleTop 川.singleTaskIV .sin gle In sta neeF面我來分別做介紹。、 standard顧名思義, standard 英文意思就是“標(biāo)準(zhǔn)的。也就是說這種啟動模式是默認(rèn)
6、的, 我們平時在開發(fā)中使用最多的就是 Standard 模式的。如果一個 Activity 的啟動模式被設(shè)置成 standard ,那么它可以無限制的創(chuàng)立。你每一 次通過 Intent 去啟動這種模式的 Activity 都會重新創(chuàng)立一個。大家可以想象一下里的收件箱假設(shè)我們將翻開的 Activity 的啟動模式設(shè)置為 Standard ,當(dāng)然這也是默認(rèn)的模式里有 10 封。我們給查看的 Activity 起名為 CheckEmailActivity, 我點(diǎn)擊第一封將會翻開一個 CheckEmailActivity ,當(dāng)我看完之后點(diǎn)擊 下一封,另一個 CheckEmailActivity 又會被
7、創(chuàng)立,這樣如果我們將 10 封全部看完,那在 Activity 任務(wù)棧中將會有 10 個 CheckEmailActivity ,而且如果我想回到收件箱頁面還必須 點(diǎn) 10 次返回鍵!想想是不是很可怕?所以說 standard 模式雖然很常用,但也不是適用于任何場合。另外說一點(diǎn), standard 模式在 Android 5.0 Lollipop 之前和之后是有區(qū)別的。Android Lollipop 之前standard 模式的 Activity 總是會被創(chuàng)立在啟動它的 Activity 同一個任務(wù)棧中頂端 任 務(wù)棧是一個棧結(jié)構(gòu),先進(jìn)后出 First In Last Out ,就算他們來自不
8、同的應(yīng)用。想象一個場景, 如果你在 A 應(yīng)用中要分享一個本地圖片, 這樣會翻開系統(tǒng)的圖片查看應(yīng) 用中的圖片選擇器 Activity ,雖然這兩個 Activity 來自不同的應(yīng)用,但 Android 系統(tǒng)仍將 會把他們放在同一個任務(wù)棧中,即A 應(yīng)用的任務(wù)棧中。Activity 1Activity 1Activity 2Task #1Fask#lAn droid Lollipop之后如果將要啟動的 Activity 和啟動它的Activity來自同一個應(yīng)用,那沒話說,和Lollipop之前一樣,新的Activity會被創(chuàng)立在當(dāng)前任務(wù)棧中的頂端。但是如果它們來自不同的應(yīng)用,那就會創(chuàng)立一個新的任務(wù)棧
9、,再把要啟動的Activity放在新的任務(wù)棧中,這時這個新啟動的 Activity就是新創(chuàng)立的任務(wù)站點(diǎn)的根Activity 。如以下圖所示:Activity 1分享圖片Activity 2Task #1、singleTop顧名思義,sin gleTop的意思就是"在頂部只能有一個這種啟動模式非常類似于standard,但是也有一些區(qū)別:如果在啟動這種模式的Activity的時候,當(dāng)前任務(wù)棧的頂端已經(jīng)存在了一樣的Activity,那系統(tǒng)就不會再創(chuàng)立新的,而是回調(diào)任務(wù)棧中已經(jīng)存在的該Activity 的onN ewI nte nt() 方法。請看下面的示意圖:DemoActivitytJ
10、Lc.| IIIIT餐t 料Tastffl也正因?yàn)镾ingleTop啟動模式的特殊性,所以在開發(fā)時,如果指定了一個Activity的啟動模式是sin gleTop的那就應(yīng)該既要重寫 on Created。方法用于應(yīng)對第一次創(chuàng)立的情 況,也要重寫onNewIn te nt() 方法來應(yīng)對重復(fù)創(chuàng)立的情況。其實(shí)大家可以想象一下,這種啟動模式的應(yīng)用場景。An droid既然提供了這種啟動模式,說明肯定有應(yīng)有場景需要這樣的方式。其實(shí)最常用的場景就是搜索,比方說我們在搜索框中輸入想要搜索的容點(diǎn)擊搜索進(jìn)入SearchResultActivty( 搜索結(jié)果頁)查看搜索的結(jié)果一般我們也會在搜索結(jié)果頁提供搜索框,
11、這樣用戶無需點(diǎn)擊返回鍵回到上一個頁面再在搜索框中輸入搜索容點(diǎn)擊搜索,如果此時用戶還想搜點(diǎn)別的東西,就可以直接在當(dāng)前的搜索結(jié)果頁 SearchResultActivty中的搜索框輸入搜索容繼續(xù)搜索。大家想象一下,如果我們把SearchResultActivty的啟動模式設(shè)置為 Standard的話會是什么樣的景象。比方我們連著搜了10個容,那就會啟動10個不同的SearchResultActivty,然而這些 SearchResultActivty功能完全一樣,完全沒有必要創(chuàng)立這么多,而且還有一個和上一節(jié)中的一樣的問題,就是用戶搜索完畢想回到首頁,那就還得按10次返回鍵才能回到首頁,-!這時,s
12、ingleTop啟動模式就派上用場了,我們首先把SearchResultActivty 的啟動模式設(shè)置為singleTop,這樣用戶在SearchResultActivty頁面中繼續(xù)搜索的時候,我們只需 把用戶要搜索的容放在 Intent 里面然后啟動 SearchResultActivty ,這時系統(tǒng)并不會重新 創(chuàng)立新的 SearchResultActivty ,而是回調(diào)當(dāng)前任務(wù)棧棧頂?shù)?SearchResultActivty 的 onNewIntent() 方法來接收帶有用戶搜索容信息的 Intent ,然后我們拿到用戶搜索容后調(diào)搜 索接口, 并根據(jù)接口返回容重新刷新布局即可, 似不似很神
13、奇?其實(shí)我們在上一節(jié)提到的的 問題,也是用這種方式來解決的,原理和搜索一樣的。三、 singleTask這種啟動模式的 Activity 在 Android 系統(tǒng)中只允許存在一個實(shí)例。如果系統(tǒng)中已經(jīng)存在了該種啟動模式的目標(biāo) Activity ,那么系統(tǒng)并不會重新創(chuàng)立一個 目標(biāo) Activity ,而是首先將持有目標(biāo) Activity 的整個任務(wù)棧都會被置于前臺 用戶可見 , 并且通過 onNewIntent( ) 方法將啟動目標(biāo) Activity 的 Intent 傳遞給目標(biāo) Activity ,置于 目標(biāo) Activity 拿到這個 Intent 之后要做什么操作, 系統(tǒng)就不管了, 隨便你拿
14、來干什么, 哼 。但是這里有個問題,就是目標(biāo) Activity 和源 Activity 是不是來自同一應(yīng)用。源 Activity 和目標(biāo) Activity 來自同一個應(yīng)用這種情況還要分兩種情況說:當(dāng)前系統(tǒng)中還沒有目標(biāo) Activity 的實(shí)例這種情況最簡單, 直接在當(dāng)前的任務(wù)棧中創(chuàng)立 SingleTask 模式的 Activity 并置于棧頂即可。當(dāng)前系統(tǒng)中已經(jīng)存在目標(biāo) Activity 的實(shí)例 這種情況比較特殊, 因?yàn)橄到y(tǒng)會把任務(wù)棧中目標(biāo) Activity 之上的所有 Activity 銷毀, 以讓 目標(biāo) Activity 處在棧頂?shù)奈恢?。這里還要還要再提醒大家的是,因?yàn)槟繕?biāo) Activit
15、y 已經(jīng)存在,系統(tǒng)不會重新創(chuàng)立,而 是通過 onNewIntent() 的方式把 Intent 傳遞過來,這點(diǎn)和 singleTop 模式有些類似。注意 了,這里讓我們回想一下文章開頭的我所說的場景, 如何讓用戶在支付完成頁直接跳轉(zhuǎn)到首 頁,并把不需要的 Activity 銷毀? SingleTask 啟動模式是不是剛好和我們的需求一致?請 看下面的示意圖:Ta-kfflTask #11.首頁2搜當(dāng)結(jié)果頁 J 川“F凱11 !( f *>13,確彳門丁單庫«剛1i.I1'Bii 1 !: :!ii-iii! _ T u Npwintpntf )j: i-I«
16、i1 i*V1*13iIiip*V源Activity 和目標(biāo)Activity 來自不同應(yīng)用,這種情況也要分兩種情況說:當(dāng)前系統(tǒng)中還沒有目標(biāo)Activity 的實(shí)例這時系統(tǒng)首先會看任務(wù)管理器中是否有目標(biāo)Actvity 所在應(yīng)用的任務(wù)棧?如果有的話, 那就直接在目標(biāo)Activity所在應(yīng)用的任務(wù)棧的棧頂創(chuàng)立即可。如果任務(wù)管理器中沒有目標(biāo)Activity所在應(yīng)用的任務(wù)棧,系統(tǒng)就會創(chuàng)立其所在應(yīng)用的任務(wù)棧和目標(biāo) Activity ,并且把目標(biāo) Activity作為新建任務(wù)棧的根Activity 。如以下圖所示:當(dāng)前系統(tǒng)中已經(jīng)存在目標(biāo)Activity 的實(shí)例目標(biāo)Activity所在任務(wù)棧會被置于前臺即用戶
17、可見,而且也會把目標(biāo)Activity之上的所有Actvity全部銷毀。So u rccrAct I viCvSdurcie-ActivltvTaskTask 科 1四、singlelnstanee這種啟動模式和sin gleTask幾乎一樣,它也只允許系統(tǒng)中存在一個目標(biāo)Activity ,包 括上面我們所說的 SingleTask的一些特性singlelnstanee 都有。唯一不同的是,持有目標(biāo) Activity 的任務(wù)棧中只能有目標(biāo) Activity 一個Aetvitiy ,不能再有別的Activity ,對!就 是承包了這個任務(wù)棧!哈哈 。其實(shí)從這種啟動模式的名字也可以看出來它表示的意思
18、,sin gle In sta nee直譯過來就是“單一實(shí)例,什么意思呢?這話啊有兩層意思,我來給你分析分析:1跟系統(tǒng)說,“我是獨(dú)一無二的,不許和我一樣的人存在!",這就是說系統(tǒng)中存在一個目標(biāo)Activity 。;2.跟任務(wù)棧說,“我是獨(dú)一無二的,不許你心里再裝別的人!",這就是說持有目標(biāo) Activity 的任務(wù)棧中只能有目標(biāo)Activity 一個Activity。這樣說是不是好理解一些,哈哈所以,如果要啟動 singlelnstanee模式的Activity,那只能新創(chuàng)立一個任務(wù)棧用來放它,因?yàn)槿思艺f了,“我是獨(dú)一無二的!"。同樣的,如果從這種啟動模式的Act
19、ivity 中啟動別的Activity,那不好意思,我不管你是不是和我處在同一個應(yīng)用,我所在的任務(wù)棧只能擁有我一個人,您吶,另外讓系統(tǒng)給你創(chuàng)立一個任務(wù)棧待著去吧。好了,至此我們介紹了Activity 的4種啟動模式了,也大致了解了每種啟動模式的特點(diǎn)了,那接下里的問題就是怎么使用呢?問題又拋出來了,好,讓我們接著往下看。怎么使用啟動模式?有兩種方式來使用或者說設(shè)置Activity 的啟動模式:方式1:在AndroidMenifest.xml文件中設(shè)置:activity android name ,app.DemoActivity"android:label="string/D
20、enoM android theme "iSstvle/Theme.Dialog" :android launchMode "singleTask", ;activity看到?jīng)]有,在標(biāo)簽中設(shè)置 android:launchMode= " * “屬性即可,*即我們上面所說的 四種啟動模式。方式2:通過為Intent添加標(biāo)識來設(shè)置rntrnt intent, _) 加疋如 現(xiàn)珂class)5 intent addFlags(Intent FLAG ACTIVITY SINGLE TASK);-startActivrty(intent);看到?jīng)]有,這里使用Intent的addFlags()方法來添加一些標(biāo)志,其實(shí)這個addFlags()不光可以用來設(shè)置 Activity 附加屬性。具體的可以參見的啟動模式,還能做很多事情,匕的作用是給Intent添
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國粒度分析行業(yè)市場全景分析及前景機(jī)遇研判報告
- 2024年度浙江省護(hù)師類之主管護(hù)師模擬預(yù)測參考題庫及答案
- 2024年度浙江省二級造價工程師之建設(shè)工程造價管理基礎(chǔ)知識??寄M試題(全優(yōu))
- 2024年度浙江省二級造價工程師之土建建設(shè)工程計量與計價實(shí)務(wù)提升訓(xùn)練試卷A卷附答案
- 中醫(yī)超聲波治療的應(yīng)用與發(fā)展
- 腫瘤病人護(hù)理常識培訓(xùn)
- DB43-T 2877-2023 棉鈴蟲齒唇姬蜂人工繁育技術(shù)規(guī)程
- 模具課程培訓(xùn)課件
- 幼兒園小班圣誕節(jié)繪本故事課件
- 幼兒園小班美術(shù)《蘋果樹》教案
- 2024年湖南省公安廳招聘警務(wù)輔助人員筆試真題
- 弘揚(yáng)中國精神的課件
- 2025年高考英語全國二卷試題含答案
- 2025江蘇揚(yáng)州寶應(yīng)縣“鄉(xiāng)村振興青年人才”招聘67人筆試備考題庫及完整答案詳解一套
- 云南省玉溪市2023-2024學(xué)年高二下學(xué)期期末教學(xué)質(zhì)量檢測語文試卷(含答案)
- 撫州市樂安縣招聘城市社區(qū)工作者筆試真題2024
- 網(wǎng)絡(luò)服務(wù)器配置與管理(微課版) 教案 項(xiàng)目02 虛擬化技術(shù)和VMware-2
- 2025年西式面點(diǎn)師(中級)面包烘焙實(shí)操考試試卷
- T/CAPEC 3-2018汽輪機(jī)制造監(jiān)理技術(shù)要求
- 工程完工后的回訪與保修服務(wù)承諾
- 拖欠房租分期協(xié)議書
評論
0/150
提交評論