




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
全面解析Activity的4種啟動(dòng)模式說到Android的啟動(dòng)模式,首先來看一個(gè)實(shí)際的業(yè)務(wù)場景。我之前在公司實(shí)習(xí)的時(shí)候,我所在的部門只負(fù)責(zé)一個(gè)品類(國際機(jī)票),那用戶從機(jī)票首頁開始搜索機(jī)票到最終完成訂單并支付大致分為以下幾個(gè)流程(實(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)好訂單內(nèi)容點(diǎn)擊下單,開始支付,支付完成跳支付完成頁4.用戶可以選擇回到首頁,或者去公共訂單系統(tǒng)查看訂單詳情(這屬于公共部分,不在我們討論的范圍內(nèi)了)經(jīng)過上面4個(gè)步驟整個(gè)購票流程就算結(jié)束了。但是,這里有個(gè)問題,就是用戶從首頁到最后的支付完成頁之間經(jīng)歷了這么多的Activity,那用戶完成了支付后想回到首頁是不是要一層一層的往回退才行?如果是這樣的話,那就太不人性化了,那怎樣才能在完成支付后一鍵回到首頁呢?有人可能會(huì)說,那就直接從支付完成頁跳轉(zhuǎn)到首頁不就可以了嗎?這樣當(dāng)然是可以的,但是這樣做那之前打開的那么多Activity怎么辦呢?難道就讓它們待在Activity任務(wù)棧中嗎?這樣豈不是太浪費(fèi)內(nèi)存了!請(qǐng)看我畫的示意圖:如上圖所示,如果我們在支付完成之后啟動(dòng)首頁Activity那頁面1-頁面5之間的所有Activity對(duì)用戶來說都是無用的,并且占用的內(nèi)存,極大地浪費(fèi)這本來可能就很緊張的Android內(nèi)存資源。那有沒有一些優(yōu)雅的方式來解決這個(gè)問題呢?我們可以想象一下,有沒有可能在從頁面4跳轉(zhuǎn)首頁的時(shí)候把原來處于首頁之上的所有Activity全部干掉呢?這樣不就剛好解決了我們剛剛所說浪費(fèi)資源的問題了嗎?就像下圖一樣:AndroidLollipop之后如果將要啟動(dòng)的Activity和啟動(dòng)它的Activity來自同一個(gè)應(yīng)用,那沒話說,和Lollipop之前一樣,新的Activity會(huì)被創(chuàng)建在當(dāng)前任務(wù)棧中的頂端。但是如果它們來自不同的應(yīng)用,那就會(huì)創(chuàng)建一個(gè)新的任務(wù)棧,再把要啟動(dòng)的Activity放在新的任務(wù)棧中,這時(shí)這個(gè)新啟動(dòng)的Activity就是新創(chuàng)建的任務(wù)站點(diǎn)的根Activity。如下圖所示:二、singleTop顧名思義,singleTop的意思就是“在頂部只能有一個(gè)”。這種啟動(dòng)模式非常類似于standard,但是也有一些區(qū)別:如果在啟動(dòng)這種模式的Activity的時(shí)候,當(dāng)前任務(wù)棧的頂端已經(jīng)存在了相同的Activity,那系統(tǒng)就不會(huì)再創(chuàng)建新的,而是回調(diào)任務(wù)棧中已經(jīng)存在的該Activity的onNewIntent()方法。請(qǐng)看下面的示意圖:也正因?yàn)镾ingleTop啟動(dòng)模式的特殊性,所以在開發(fā)時(shí),如果指定了一個(gè)Activity的啟動(dòng)模式是singleTop的那就應(yīng)該既要重寫onCreated()方法用于應(yīng)對(duì)第一次創(chuàng)建的情況,也要重寫onNewIntent()方法來應(yīng)對(duì)重復(fù)創(chuàng)建的情況。其實(shí)大家可以想象一下,這種啟動(dòng)模式的應(yīng)用場景。Android既然提供了這種啟動(dòng)模式,說明肯定有應(yīng)有場景需要這樣的方式。其實(shí)最常用的場景就是搜索,比方說我們在搜索框中輸入想要搜索的內(nèi)容點(diǎn)擊搜索進(jìn)入SearchResultActivty(搜索結(jié)果頁)查看搜索的結(jié)果(一般我們也會(huì)在搜索結(jié)果頁提供搜索框,這樣用戶無需點(diǎn)擊返回鍵回到上一個(gè)頁面再在搜索框中輸入搜索內(nèi)容點(diǎn)擊搜索),如果此時(shí)用戶還想搜點(diǎn)別的東西,就可以直接在當(dāng)前的搜索結(jié)果頁SearchResultActivty中的搜索框輸入搜索內(nèi)容繼續(xù)搜索。大家想象一下,如果我們把SearchResultActivty的啟動(dòng)模式設(shè)置為Standard的話會(huì)是什么樣的景象。比如我們連著搜了10個(gè)內(nèi)容,那就會(huì)啟動(dòng)10個(gè)不同的SearchResultActivty,然而這些SearchResultActivty功能完全一樣,完全沒有必要?jiǎng)?chuàng)建這么多,而且還有一個(gè)和上一節(jié)中的郵箱一樣的問題,就是用戶搜索結(jié)束想回到首頁,那就還得按10次返回鍵才能回到首頁,--!這時(shí),singleTop啟動(dòng)模式就派上用場了,我們首先把SearchResultActivty的啟動(dòng)模式設(shè)置為singleTop,這樣用戶在SearchResultActivty頁面中繼續(xù)搜索的時(shí)候,我們只需把用戶要搜索的內(nèi)容放在Intent里面然后啟動(dòng)SearchResultActivty,這時(shí)系統(tǒng)并不會(huì)重新創(chuàng)建新的SearchResultActivty,而是回調(diào)當(dāng)前任務(wù)棧棧頂?shù)腟earchResultActivty的onNewIntent()方法來接收帶有用戶搜索內(nèi)容信息的Intent,然后我們拿到用戶搜索內(nèi)容后調(diào)搜索接口,并根據(jù)接口返回內(nèi)容重新刷新布局即可,似不似很神奇?其實(shí)我們在上一節(jié)提到的郵箱的問題,也是用這種方式來解決的,原理和搜索一樣的。三、singleTask這種啟動(dòng)模式的Activity在Android系統(tǒng)中只允許存在一個(gè)實(shí)例。如果系統(tǒng)中已經(jīng)存在了該種啟動(dòng)模式的目標(biāo)Activity,則系統(tǒng)并不會(huì)重新創(chuàng)建一個(gè)目標(biāo)Activity,而是首先將持有目標(biāo)Activity的整個(gè)任務(wù)棧都會(huì)被置于前臺(tái)(用戶可見),并且通過onNewIntent()方法將啟動(dòng)目標(biāo)Activity的Intent傳遞給目標(biāo)Activity,置于目標(biāo)Activity拿到這個(gè)Intent之后要做什么操作,系統(tǒng)就不管了,隨便你拿來干什么,哼~。但是這里有個(gè)問題,就是目標(biāo)Activity和源Activity是不是來自同一應(yīng)用。源Activity和目標(biāo)Activity來自同一個(gè)應(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)會(huì)把任務(wù)棧中目標(biāo)Activity之上的所有Activity銷毀,以讓目標(biāo)Activity處在棧頂?shù)奈恢谩_@里還要還要再提醒大家的是,因?yàn)槟繕?biāo)Activity已經(jīng)存在,系統(tǒng)不會(huì)重新創(chuàng)建,而是通過onNewIntent()的方式把Intent傳遞過來,這點(diǎn)和singleTop模式有些類似。注意了,這里讓我們回想一下文章開頭的我所說的場景,如何讓用戶在支付完成頁直接跳轉(zhuǎn)到首頁,并把不需要的Activity銷毀?SingleTask啟動(dòng)模式是不是剛好和我們的需求一致?請(qǐng)看下面的示意圖:源Activity和目標(biāo)Activity來自不同應(yīng)用,這種情況也要分兩種情況說:當(dāng)前系統(tǒng)中還沒有目標(biāo)Activity的實(shí)例這時(shí)系統(tǒng)首先會(huì)看任務(wù)管理器中是否有目標(biāo)Actvity所在應(yīng)用的任務(wù)棧?如果有的話,那就直接在目標(biāo)Activity所在應(yīng)用的任務(wù)棧的棧頂創(chuàng)建即可。如果任務(wù)管理器中沒有目標(biāo)Activity所在應(yīng)用的任務(wù)棧,系統(tǒng)就會(huì)創(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ù)棧會(huì)被置于前臺(tái)(即用戶可見),而且也會(huì)把目標(biāo)Activity之上的所有Actvity全部銷毀。四、singleInstance這種啟動(dòng)模式和singleTask幾乎一樣,它也只允許系統(tǒng)中存在一個(gè)目標(biāo)Activity,包括上面我們所說的SingleTask的一些特性singleInstance都有。唯一不同的是,持有目標(biāo)Activity的任務(wù)棧中只能有目標(biāo)Activity一個(gè)Actvitiy,不能再有別的Activity,對(duì)!就是承包了這個(gè)任務(wù)棧!哈哈~。其實(shí)從這種啟動(dòng)模式的名字也可以看出來它表示的意思,singleInstance直譯過來就是“單一實(shí)例”,什么意思呢?這話啊有兩層意思,我來給你分析分析:1.跟系統(tǒng)說,“我是獨(dú)一無二的,不許和我一樣的人存在!”,這就是說系統(tǒng)中存在一個(gè)目標(biāo)Activity。;2.跟任務(wù)棧說,“我是獨(dú)一無二的,不許你心里再裝別的人!”,這就是說持有目標(biāo)Activity的任務(wù)棧中只能有目標(biāo)Activity一個(gè)Activity。這樣說是不是好理解一些,哈哈~所以,如果要啟動(dòng)singleInstance模式的Activity,那只能新創(chuàng)建一個(gè)任務(wù)棧用來放它,因?yàn)槿思艺f了,“我是獨(dú)一無二的!”。同樣的,如果從這種啟動(dòng)模式的Activity中啟動(dòng)別的Activity,那不好意思,我不管你是不是和我處在同一個(gè)應(yīng)用,我所在的任務(wù)棧只能擁有我一個(gè)人,您吶,另外讓系統(tǒng)給你創(chuàng)建一個(gè)任務(wù)棧待著去吧。好了,至此我們介紹了Activity的4種啟動(dòng)模式了,也大致了解了每種啟動(dòng)模式的特點(diǎn)了,那接下里的問題就是怎么使用呢?問題又拋出來了,好,讓我們接著往下看。怎么使用啟動(dòng)模式?有兩種方式來使用或者說設(shè)置Activity的啟動(dòng)模式:方式1:在AndroidMenifest.xml文件中設(shè)置:看到?jīng)]有,在標(biāo)簽中設(shè)置android:launchMode=”**“屬性即可,**即我們上面所說的四種啟動(dòng)模式。方式2:通過為Intent添加標(biāo)識(shí)來設(shè)置看到?jīng)]有,這里使用Intent的addFlags()方法來添加一些標(biāo)志,其實(shí)這個(gè)addFlags()不光可以用來設(shè)置Activity的啟動(dòng)模式,還能做很多事情,它的作用是給Intent添加一些附加屬性。具體的可以參見Androidapi哈~那我們想設(shè)置Activity的啟動(dòng)模式應(yīng)該給addFlags()方法設(shè)置哪些參數(shù)呢?來,接著往下看:FLAG_ACTIVITY_NEW_TASK與”singleTask”啟動(dòng)模式的作用一樣。FLAG_ACTIVITY_SINGLE_TOP與”singleTop”啟動(dòng)模式的作用一樣。FLAG_ACTIVITY_CLEAR_TOP這個(gè)標(biāo)識(shí)的意思比較特殊。它不對(duì)應(yīng)于我們上面所說的啟動(dòng)模式中的任何一種,我們來看一下androidapi中對(duì)這個(gè)標(biāo)識(shí)的說明:“如果正在啟動(dòng)的Activity已在當(dāng)前任務(wù)中運(yùn)行,則會(huì)銷毀當(dāng)前任務(wù)頂部的所有Activity,并通過onNewIntent()將此Intent傳遞給Activity已恢復(fù)的實(shí)例(現(xiàn)在位于頂部),而不是啟動(dòng)該Activity的新實(shí)例。”大家可能會(huì)發(fā)現(xiàn),通過addFlags()的方式來設(shè)置啟動(dòng)模式有局限性,只能顯示的設(shè)置“singleTa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 復(fù)習(xí)練習(xí)《數(shù)列》1(人教版必修5)
- 2025年高考數(shù)學(xué)模擬檢測卷(數(shù)學(xué)文化與數(shù)學(xué)史)數(shù)學(xué)思維訓(xùn)練試題
- 高級(jí)統(tǒng)計(jì)師統(tǒng)計(jì)法規(guī)2025年考前必看押題卷及案例分析
- 宮外孕的護(hù)理計(jì)劃
- 2025年美發(fā)師中級(jí)實(shí)操考核試卷:剪發(fā)技巧與實(shí)操案例分析試題
- 2025年一建《機(jī)電工程管理與實(shí)務(wù)》考試機(jī)電工程法規(guī)題庫:法規(guī)應(yīng)用與案例分析模擬試卷
- 2025年校園快遞代收點(diǎn)物流優(yōu)化與管理建議
- 備戰(zhàn)2025屆新高考政治一輪總復(fù)習(xí)階段檢測卷八邏輯與思維(附解析)
- 包皮過長包莖護(hù)理
- 2025年小學(xué)英語畢業(yè)考試模擬試卷:英語歌曲與童謠教學(xué)情境創(chuàng)設(shè)策略研究案例總結(jié)試題
- Unit 4 Healthy food Part A Let's learn(課件)-2024-2025學(xué)年人教PEP版英語三年級(jí)下冊
- 天津市河?xùn)|區(qū)2024-2025學(xué)年高三下學(xué)期一模考試 化學(xué)試題(含答案)
- 計(jì)算機(jī)類創(chuàng)業(yè)計(jì)劃書
- 第三單元 主題活動(dòng)三《建筑模型我設(shè)計(jì)》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年四年級(jí)下冊綜合實(shí)踐活動(dòng)內(nèi)蒙古版
- 糧食工程專業(yè)實(shí)習(xí)報(bào)告范文
- 2025年高考數(shù)學(xué)復(fù)習(xí)(新高考專用)重難點(diǎn)09極值點(diǎn)偏移與拐點(diǎn)偏移問題【七大題型】特訓(xùn)(學(xué)生版+解析)
- 廣東省華附、省實(shí)、廣雅、深中2025屆高三四校聯(lián)考語文試題與答案
- 皮下氣腫治療
- DBJT45-007-2012 廣西壯族自治區(qū)先張法預(yù)應(yīng)力混凝土管樁基礎(chǔ)技術(shù)規(guī)程
- 皮肌炎皮膚護(hù)理查房
- 2025年河北省職業(yè)院校技能大賽工業(yè)互聯(lián)網(wǎng)集成應(yīng)用參考試題庫(含答案)
評(píng)論
0/150
提交評(píng)論