版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
全面解析Activity的4種啟動(dòng)模式說(shuō)到Android的啟動(dòng)模式,首先來(lái)看一個(gè)實(shí)際的業(yè)務(wù)場(chǎng)景。我之前在公司實(shí)習(xí)的時(shí)候,我所在的部門(mén)只負(fù)責(zé)一個(gè)品類(lèi)(國(guó)際機(jī)票),那用戶從機(jī)票首頁(yè)開(kāi)始搜索機(jī)票到最終完成訂單并支付大致分為以下幾個(gè)流程(實(shí)際流程因?yàn)榭紤]的問(wèn)題比較多,所以要比這稍微復(fù)雜些):1.用戶在機(jī)票首頁(yè)確認(rèn)好出發(fā)、到達(dá)目的地、日期及人數(shù)后,就可以點(diǎn)擊“搜索”進(jìn)入到搜索結(jié)果頁(yè)2.用戶根據(jù)意愿選擇相應(yīng)航班并點(diǎn)擊進(jìn)入確認(rèn)訂單頁(yè)3.用戶確認(rèn)好訂單內(nèi)容點(diǎn)擊下單,開(kāi)始支付,支付完成跳支付完成頁(yè)4.用戶可以選擇回到首頁(yè),或者去公共訂單系統(tǒng)查看訂單詳情(這屬于公共部分,不在我們討論的范圍內(nèi)了)經(jīng)過(guò)上面4個(gè)步驟整個(gè)購(gòu)票流程就算結(jié)束了。但是,這里有個(gè)問(wèn)題,就是用戶從首頁(yè)到最后的支付完成頁(yè)之間經(jīng)歷了這么多的Activity,那用戶完成了支付后想回到首頁(yè)是不是要一層一層的往回退才行?如果是這樣的話,那就太不人性化了,那怎樣才能在完成支付后一鍵回到首頁(yè)呢?有人可能會(huì)說(shuō),那就直接從支付完成頁(yè)跳轉(zhuǎn)到首頁(yè)不就可以了嗎?這樣當(dāng)然是可以的,但是這樣做那之前打開(kāi)的那么多Activity怎么辦呢?難道就讓它們待在Activity任務(wù)棧中嗎?這樣豈不是太浪費(fèi)內(nèi)存了!請(qǐng)看我畫(huà)的示意圖:如上圖所示,如果我們?cè)谥Ц锻瓿芍髥?dòng)首頁(yè)Activity那頁(yè)面1-頁(yè)面5之間的所有Activity對(duì)用戶來(lái)說(shuō)都是無(wú)用的,并且占用的內(nèi)存,極大地浪費(fèi)這本來(lái)可能就很緊張的Android內(nèi)存資源。那有沒(méi)有一些優(yōu)雅的方式來(lái)解決這個(gè)問(wèn)題呢?我們可以想象一下,有沒(méi)有可能在從頁(yè)面4跳轉(zhuǎn)首頁(yè)的時(shí)候把原來(lái)處于首頁(yè)之上的所有Activity全部干掉呢?這樣不就剛好解決了我們剛剛所說(shuō)浪費(fèi)資源的問(wèn)題了嗎?就像下圖一樣:AndroidLollipop之后如果將要啟動(dòng)的Activity和啟動(dòng)它的Activity來(lái)自同一個(gè)應(yīng)用,那沒(méi)話說(shuō),和Lollipop之前一樣,新的Activity會(huì)被創(chuàng)建在當(dāng)前任務(wù)棧中的頂端。但是如果它們來(lái)自不同的應(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)模式非常類(lèi)似于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)模式的特殊性,所以在開(kāi)發(fā)時(shí),如果指定了一個(gè)Activity的啟動(dòng)模式是singleTop的那就應(yīng)該既要重寫(xiě)onCreated()方法用于應(yīng)對(duì)第一次創(chuàng)建的情況,也要重寫(xiě)onNewIntent()方法來(lái)應(yīng)對(duì)重復(fù)創(chuàng)建的情況。其實(shí)大家可以想象一下,這種啟動(dòng)模式的應(yīng)用場(chǎng)景。Android既然提供了這種啟動(dòng)模式,說(shuō)明肯定有應(yīng)有場(chǎng)景需要這樣的方式。其實(shí)最常用的場(chǎng)景就是搜索,比方說(shuō)我們?cè)谒阉骺蛑休斎胂胍阉鞯膬?nèi)容點(diǎn)擊搜索進(jìn)入SearchResultActivty(搜索結(jié)果頁(yè))查看搜索的結(jié)果(一般我們也會(huì)在搜索結(jié)果頁(yè)提供搜索框,這樣用戶無(wú)需點(diǎn)擊返回鍵回到上一個(gè)頁(yè)面再在搜索框中輸入搜索內(nèi)容點(diǎn)擊搜索),如果此時(shí)用戶還想搜點(diǎn)別的東西,就可以直接在當(dāng)前的搜索結(jié)果頁(yè)SearchResultActivty中的搜索框輸入搜索內(nèi)容繼續(xù)搜索。大家想象一下,如果我們把SearchResultActivty的啟動(dòng)模式設(shè)置為Standard的話會(huì)是什么樣的景象。比如我們連著搜了10個(gè)內(nèi)容,那就會(huì)啟動(dòng)10個(gè)不同的SearchResultActivty,然而這些SearchResultActivty功能完全一樣,完全沒(méi)有必要?jiǎng)?chuàng)建這么多,而且還有一個(gè)和上一節(jié)中的郵箱一樣的問(wèn)題,就是用戶搜索結(jié)束想回到首頁(yè),那就還得按10次返回鍵才能回到首頁(yè),--!這時(shí),singleTop啟動(dòng)模式就派上用場(chǎng)了,我們首先把SearchResultActivty的啟動(dòng)模式設(shè)置為singleTop,這樣用戶在SearchResultActivty頁(yè)面中繼續(xù)搜索的時(shí)候,我們只需把用戶要搜索的內(nèi)容放在Intent里面然后啟動(dòng)SearchResultActivty,這時(shí)系統(tǒng)并不會(huì)重新創(chuàng)建新的SearchResultActivty,而是回調(diào)當(dāng)前任務(wù)棧棧頂?shù)腟earchResultActivty的onNewIntent()方法來(lái)接收帶有用戶搜索內(nèi)容信息的Intent,然后我們拿到用戶搜索內(nèi)容后調(diào)搜索接口,并根據(jù)接口返回內(nèi)容重新刷新布局即可,似不似很神奇?其實(shí)我們?cè)谏弦还?jié)提到的郵箱的問(wèn)題,也是用這種方式來(lái)解決的,原理和搜索一樣的。三、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)(用戶可見(jiàn)),并且通過(guò)onNewIntent()方法將啟動(dòng)目標(biāo)Activity的Intent傳遞給目標(biāo)Activity,置于目標(biāo)Activity拿到這個(gè)Intent之后要做什么操作,系統(tǒng)就不管了,隨便你拿來(lái)干什么,哼~。但是這里有個(gè)問(wèn)題,就是目標(biāo)Activity和源Activity是不是來(lái)自同一應(yīng)用。源Activity和目標(biāo)Activity來(lái)自同一個(gè)應(yīng)用這種情況還要分兩種情況說(shuō):當(dāng)前系統(tǒng)中還沒(méi)有目標(biāo)Activity的實(shí)例這種情況最簡(jiǎn)單,直接在當(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銷(xiāo)毀,以讓目標(biāo)Activity處在棧頂?shù)奈恢?。這里還要還要再提醒大家的是,因?yàn)槟繕?biāo)Activity已經(jīng)存在,系統(tǒng)不會(huì)重新創(chuàng)建,而是通過(guò)onNewIntent()的方式把Intent傳遞過(guò)來(lái),這點(diǎn)和singleTop模式有些類(lèi)似。注意了,這里讓我們回想一下文章開(kāi)頭的我所說(shuō)的場(chǎng)景,如何讓用戶在支付完成頁(yè)直接跳轉(zhuǎn)到首頁(yè),并把不需要的Activity銷(xiāo)毀?SingleTask啟動(dòng)模式是不是剛好和我們的需求一致?請(qǐng)看下面的示意圖:源Activity和目標(biāo)Activity來(lái)自不同應(yīng)用,這種情況也要分兩種情況說(shuō):當(dāng)前系統(tǒng)中還沒(méi)有目標(biāo)Activity的實(shí)例這時(shí)系統(tǒng)首先會(huì)看任務(wù)管理器中是否有目標(biāo)Actvity所在應(yīng)用的任務(wù)棧?如果有的話,那就直接在目標(biāo)Activity所在應(yīng)用的任務(wù)棧的棧頂創(chuàng)建即可。如果任務(wù)管理器中沒(méi)有目標(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)(即用戶可見(jiàn)),而且也會(huì)把目標(biāo)Activity之上的所有Actvity全部銷(xiāo)毀。四、singleInstance這種啟動(dòng)模式和singleTask幾乎一樣,它也只允許系統(tǒng)中存在一個(gè)目標(biāo)Activity,包括上面我們所說(shuō)的SingleTask的一些特性singleInstance都有。唯一不同的是,持有目標(biāo)Activity的任務(wù)棧中只能有目標(biāo)Activity一個(gè)Actvitiy,不能再有別的Activity,對(duì)!就是承包了這個(gè)任務(wù)棧!哈哈~。其實(shí)從這種啟動(dòng)模式的名字也可以看出來(lái)它表示的意思,singleInstance直譯過(guò)來(lái)就是“單一實(shí)例”,什么意思呢?這話啊有兩層意思,我來(lái)給你分析分析:1.跟系統(tǒng)說(shuō),“我是獨(dú)一無(wú)二的,不許和我一樣的人存在!”,這就是說(shuō)系統(tǒng)中存在一個(gè)目標(biāo)Activity。;2.跟任務(wù)棧說(shuō),“我是獨(dú)一無(wú)二的,不許你心里再裝別的人!”,這就是說(shuō)持有目標(biāo)Activity的任務(wù)棧中只能有目標(biāo)Activity一個(gè)Activity。這樣說(shuō)是不是好理解一些,哈哈~所以,如果要啟動(dòng)singleInstance模式的Activity,那只能新創(chuàng)建一個(gè)任務(wù)棧用來(lái)放它,因?yàn)槿思艺f(shuō)了,“我是獨(dú)一無(wú)二的!”。同樣的,如果從這種啟動(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)了,那接下里的問(wèn)題就是怎么使用呢?問(wèn)題又拋出來(lái)了,好,讓我們接著往下看。怎么使用啟動(dòng)模式?有兩種方式來(lái)使用或者說(shuō)設(shè)置Activity的啟動(dòng)模式:方式1:在AndroidMenifest.xml文件中設(shè)置:看到?jīng)]有,在標(biāo)簽中設(shè)置android:launchMode=”**“屬性即可,**即我們上面所說(shuō)的四種啟動(dòng)模式。方式2:通過(guò)為Intent添加標(biāo)識(shí)來(lái)設(shè)置看到?jīng)]有,這里使用Intent的addFlags()方法來(lái)添加一些標(biāo)志,其實(shí)這個(gè)addFlags()不光可以用來(lái)設(shè)置Activity的啟動(dòng)模式,還能做很多事情,它的作用是給Intent添加一些附加屬性。具體的可以參見(jiàn)Androidapi哈~那我們想設(shè)置Activity的啟動(dòng)模式應(yīng)該給addFlags()方法設(shè)置哪些參數(shù)呢?來(lái),接著往下看: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)于我們上面所說(shuō)的啟動(dòng)模式中的任何一種,我們來(lái)看一下androidapi中對(duì)這個(gè)標(biāo)識(shí)的說(shuō)明:“如果正在啟動(dòng)的Activity已在當(dāng)前任務(wù)中運(yùn)行,則會(huì)銷(xiāo)毀當(dāng)前任務(wù)頂部的所有Activity,并通過(guò)onNewIntent()將此Intent傳遞給Activity已恢復(fù)的實(shí)例(現(xiàn)在位于頂部),而不是啟動(dòng)該Activity的新實(shí)例?!贝蠹铱赡軙?huì)發(fā)現(xiàn),通過(guò)addFlags()的方式來(lái)設(shè)置啟動(dòng)模式有局限性,只能顯示的設(shè)置“singleTa
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度數(shù)據(jù)中心設(shè)備維修服務(wù)協(xié)議2篇
- 二零二五年度養(yǎng)殖場(chǎng)安全生產(chǎn)管理合作協(xié)議書(shū)2篇
- 2025年度農(nóng)村個(gè)人住房租賃市場(chǎng)調(diào)節(jié)合同3篇
- 2025年度幼兒園校園文化建設(shè)項(xiàng)目合同法律效力評(píng)估3篇
- 2025年度解除勞動(dòng)合同經(jīng)濟(jì)補(bǔ)償金及企業(yè)社會(huì)責(zé)任履行合同2篇
- 2025年度農(nóng)機(jī)購(gòu)置與維修保養(yǎng)配套合同3篇
- 2025北京新能源汽車(chē)指標(biāo)租賃協(xié)議合同
- 2025年度農(nóng)村生活污水收集排放管道安裝工程合同
- 2025年度家具行業(yè)產(chǎn)品檢測(cè)與質(zhì)量認(rèn)證服務(wù)合同樣本3篇
- 2025上海市學(xué)校學(xué)生公寓床上用品買(mǎi)賣(mài)合同
- 新開(kāi)科室籌備工作計(jì)劃
- 河北省會(huì)計(jì)師事務(wù)所收費(fèi)標(biāo)準(zhǔn)
- 兒科護(hù)理學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年右江民族醫(yī)學(xué)院
- 供應(yīng)鏈組織管理智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東大學(xué)
- 家庭教育組織架構(gòu)設(shè)計(jì)(3篇模板)
- JT-T-999-2015城市公共汽電車(chē)應(yīng)急處置基本操作規(guī)程
- 2021年安全工程師《建筑施工安全》真題及答案解析
- 2024時(shí)事政治考試題庫(kù)附參考答案(黃金題型)
- 2024年新“國(guó)九條”及配套政策要點(diǎn)解讀分析報(bào)告
- 超星爾雅學(xué)習(xí)通《藝術(shù)哲學(xué)美是如何誕生的(同濟(jì)大學(xué))》2024章節(jié)測(cè)試答案
- (2024年)長(zhǎng)歌行漢樂(lè)府古詩(shī)PPT語(yǔ)文課件
評(píng)論
0/150
提交評(píng)論