




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Activity啟動模式的示例分析
這篇文章主要介紹Activity啟動模式的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!在Android應(yīng)用中,Activity是最核心的組件,如何生成一個(gè)Activity實(shí)例,可以選擇不同的啟動模式,即LaunchMode.啟動模式主要包括:standard,singleTop,singleTask,singleInstance.標(biāo)準(zhǔn)模式在每次啟動時(shí),都會創(chuàng)建實(shí)例;三種單例模式,會根據(jù)情況選擇創(chuàng)建還是復(fù)用實(shí)例.在Activity啟動中,創(chuàng)建實(shí)例的生命周期:onCreate->onStart->onResume;重用實(shí)例的生命周期:onNewIntent->onResume.在AndroidManifest的Activity中,使用launchMode屬性,可以設(shè)置啟動模式,默認(rèn)是standard模式;使用taskAffinity屬性,并添加包名,可以設(shè)置Activity棧,默認(rèn)是當(dāng)前包名,只能應(yīng)用于single模式.觀察Activity棧的腳本.adb
shell
dumpsys
activity
|
sed
-n
-e
'/Stack
#/p'
-e
'/Running
activities/,/Run
#0/p'Standard標(biāo)準(zhǔn)模式,啟動Activity的默認(rèn)模式,被啟動的Activity會運(yùn)行于啟動的Activity棧,因此必須使用Activity的Context啟動,不能使用Application,否則會報(bào)錯(cuò).如MainActivity啟動TestAActivity.Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{3caa65e3
#2711
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=2}
Run
#1:
ActivityRecord{36b06e99
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2711}
Run
#0:
ActivityRecord{27396226
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2711}
Stack
#0:
Running
activities
(most
recent
first):
TaskRecord{27d796c9
#2695
A=com.miui.home
U=0
sz=1}
Run
#0:
ActivityRecord{2e5712cb
u0
com.miui.home/.launcher.Launcher
t2695}棧內(nèi)由下到上:MainActivity->TestAActivity.SingleTop棧頂復(fù)用模式.只有Activity位于棧頂,重復(fù)啟動時(shí),會使用默認(rèn)實(shí)例,即單例模式;如果位于棧內(nèi),則仍然會創(chuàng)建實(shí)例.MainActivity啟動TestA,TestA啟動TestB,TestB啟動自身,TestB是單例.觀察棧內(nèi)情況,TestB只有一份實(shí)例,第二次創(chuàng)建復(fù)用.Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{12abf566
#2712
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=3}
Run
#2:
ActivityRecord{187d7ff7
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2712}
Run
#1:
ActivityRecord{a551034
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2712}
Run
#0:
ActivityRecord{22f9cce4
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2712}棧內(nèi):MainActivity->TestAActivity->TestBActivityMainActivity啟動TestA,TestA啟動TestB,TestB啟動TestC,TestC啟動TestB,TestB是單例.觀察棧內(nèi)情況,由于TestC是棧頂,TestC啟動TestB,TestB不是棧頂,重新創(chuàng)建TestB實(shí)例,則保留兩份TestB.
Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{1792f5f0
#2715
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=5}
Run
#4:
ActivityRecord{1e70110b
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2715}
Run
#3:
ActivityRecord{c7f4dce
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestCActivity
t2715}
Run
#2:
ActivityRecord{254536cd
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2715}
Run
#1:
ActivityRecord{36b2da15
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2715}
Run
#0:
ActivityRecord{3a1c4a6a
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2715}棧內(nèi):MainActivity->TestAActivity->TestBActivity->TestCActivity->TestBActivitySingleTask棧內(nèi)復(fù)用模式,只要Activity在一個(gè)棧中存在,多次調(diào)用時(shí),都不會創(chuàng)建實(shí)例,即單例模式.情況包含以下幾種:(1)任務(wù)棧不存在,初次啟動SingleTask實(shí)例,會創(chuàng)建任務(wù)棧和實(shí)例.MainActivity啟動TestA,TestA啟動TestB,TestB是SingleTask,并且任務(wù)棧不同.觀察可知,系統(tǒng)包含兩個(gè)任務(wù)棧,TestB位于其他任務(wù)棧中.Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{d5d53d4
#2727
A=me.chunyu.spike.stack
U=0
sz=1}
Run
#2:
ActivityRecord{1d720e55
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2727}
TaskRecord{a3f797d
#2726
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=2}
Run
#1:
ActivityRecord{ffd689d
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2726}
Run
#0:
ActivityRecord{192310ac
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2726}使用taskAffinity屬性,添加新的Activity棧,與SingleTask配合使用,Standard模式無效.新任務(wù)棧是me.chunyu.spike.stack.(2)任務(wù)棧存在,初次啟動SingleTask實(shí)例,會直接入棧,與Standard模式相同.(3)任務(wù)棧相同,再次啟動SingleTask實(shí)例,實(shí)例會置于棧頂,并清除其上面實(shí)例,具有clearTop的效果.MainActivity啟動TestA,TestA啟動TestB,TestB是SingleTask,TestB啟動TestC,TestC重新啟動TestB,則TestC會出棧.觀察可知,TestC出棧,TestB位于棧頂.Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{18230815
#2737
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=3}
Run
#4:
ActivityRecord{1126c300
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2737}
Run
#3:
ActivityRecord{3114fee8
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2737}
Run
#2:
ActivityRecord{f8e235d
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2737}TestC啟動TestB,SingleTask模式,導(dǎo)致clearTop,TestC出棧.(4)任務(wù)棧不同,再次啟動SingleTask實(shí)例,會導(dǎo)致任務(wù)棧切換,后臺置于前臺.這比較難理解.MainActivity啟動TestA,TestA啟動TestB(SingleTask實(shí)例,不同任務(wù)棧),TestB啟動TestC(與B類似),則MainActivity和TestA相同棧,TestB和TestC相同棧,此時(shí)棧頂是TestC.按Home鍵,再次啟動應(yīng)用,則默認(rèn)任務(wù)棧會啟動,TestA啟動,TestA啟動TestC.應(yīng)用當(dāng)前狀態(tài)如下.Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{1d05e6c9
#2754
A=me.chunyu.spike.stack
U=0
sz=2}
Run
#4:
ActivityRecord{3f77e822
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestCActivity
t2754}
TaskRecord{3fe736d0
#2753
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=2}
Run
#3:
ActivityRecord{15f0470e
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2753}
TaskRecord{1d05e6c9
#2754
A=me.chunyu.spike.stack
U=0
sz=2}
Run
#2:
ActivityRecord{181229e6
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2754}
TaskRecord{3fe736d0
#2753
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=2}
Run
#1:
ActivityRecord{28628d61
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2753}
TaskRecord{2d646058
#2719
A=com.android.incallui
U=0
sz=1}TestC至于棧頂,點(diǎn)擊Back鍵,不是返回TestA(啟動TestC的實(shí)例),而是TestB,即優(yōu)先返回相同棧的實(shí)例.再次是TestA,然后是MainActivity,依次出棧.SingleInstance單實(shí)例模式,啟動時(shí),系統(tǒng)會為其創(chuàng)造一個(gè)單獨(dú)的任務(wù)棧,以后每次使用,都會使用這個(gè)單例,直到其被銷毀,屬于真正的單例模式.示例:MainActivity啟動TestA,TestA啟動TestB(SingleInstance模式),TestB啟動TestC,TestC再啟動TestB,則仍啟動上一次的TestB,TestC合并入默認(rèn)棧(MainActivity+TestA).Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{384e3928
#2765
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=1}
Run
#3:
ActivityRecord{1ffc5b6b
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2765}
TaskRecord{2ad03544
#2764
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=3}
Run
#2:
ActivityRecord{293d8c37
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestCActivity
t2764}
Run
#1:
ActivityRecord{158bc0f3
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2764}
Run
#0:
ActivityRecord{77691cf
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2764}startActivityForResultstartActivityForResult不同于startActivity,使用LaunchMode模式啟動Activity時(shí),也會有一些不同,可以正常傳遞數(shù)據(jù),但是無法連續(xù)創(chuàng)建自己時(shí),會生成多份實(shí)例.TestB(singleTask模式)使用startActivity創(chuàng)建自己時(shí),會使用默認(rèn)實(shí)例,即單例;而使用startActivityForResult創(chuàng)建自己時(shí),會生成一份新的示例.Stack
#1:
Running
activities
(most
recent
first):
TaskRecord{323200ac
#2786
A=me.chunyu.clwang.stack
U=0
sz=3}
Run
#4:
ActivityRecord{3f9e14f3
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2786}
Run
#3:
ActivityRecord{30d8f17b
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2786}
Run
#2:
ActivityRecord{11b95b5c
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestBActivity
t2786}
TaskRecord{c86e175
#2785
A=me.chunyu.spike.wcl_activity_launchmode_demo
U=0
sz=2}
Run
#1:
ActivityRecord{3558d7c4
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.TestAActivity
t2785}
Run
#0:
ActivityRecord{1b8620c
u0
me.chunyu.spike.wcl_activity_launchmode_demo/.MainActivity
t2785}由此可知,因?yàn)閟tartActivityForResult需要返回值,會保留實(shí)例,覆蓋單例效果.注意:4.x版本通過startActivityForResult啟動singleTask,無法正常獲取返回值,參考.5.x以上版本修復(fù)此問題,考慮兼容性,不推薦使用startActivityForResult和singleTask.Intent設(shè)置標(biāo)志位Intent可以設(shè)置啟動標(biāo)志位,即Fent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);AndroidManifest無法設(shè)置FLAG_ACTIVITY_CLEAR_TOP,即清除棧上其他實(shí)例;Intent無法設(shè)置singleInstance啟動模式.兩者選其一使用即可,如都使用,Intent的優(yōu)先級大于AndroidManifest的優(yōu)先級.常用的標(biāo)志位:FLAG_ACTIVITY_NEW_TASK:同singleTask啟動模式.FLAG_ACTIVITY_SINGLE_TOP:同singleTop啟動模式.FLAG_ACTIVITY_CLEAR_TOP:一般和singleTask啟動模式出現(xiàn).如果是singleTask啟動模式,會清除棧上其他實(shí)例,復(fù)用實(shí)例,調(diào)用onNewIntent;如果是standard啟動模式,即默認(rèn)模式,則會清除自己和其他實(shí)例,并重新創(chuàng)建,調(diào)用onCreate.顯示棧的Shell命令Shell命令adb
shell
dumpsys
activity
|
sed
-n
-e
'/Stack
#/p'
-e
'/Running
activities/,/Run
#0/p'直接獲取Activity信息有些冗余,我們只關(guān)注堆棧信息即可.sed可以編輯顯示的文字.-n,從截取處開始連續(xù)處理.-e,多選參數(shù).'/Stack#/p',輸出含有Stack#的行.-e'/Runningactivities/,/Run#0/p',輸出從Runningactivities至Run#0的所有行.輸出結(jié)果
Stack
#1:
Running
activities
(most
recent
first):
TaskRecord
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年金融研究所科研財(cái)務(wù)助理招聘考試真題
- 2024年衡陽市郵政業(yè)安全中心招聘考試真題
- 2024年廣東開放大學(xué)招聘事業(yè)單位工作人員考試真題
- 2024年傳媒出版行業(yè)市場運(yùn)行現(xiàn)狀及投資戰(zhàn)略研究報(bào)告
- 2024年佛山市華材職業(yè)技術(shù)學(xué)校招聘合同人員筆試真題
- 京東商城客服合同范本
- 二零二五年度文化旅游融合贊助合同
- 2025年度戀愛雙方子女教育理念與實(shí)施計(jì)劃協(xié)議合同
- 2025年度農(nóng)業(yè)抵押借款合同協(xié)議書
- 2025年度農(nóng)村宅基地置換補(bǔ)償及安置協(xié)議書
- 《贏利》精讀圖解
- 高一化學(xué)必修一試題
- 大學(xué)生職業(yè)素養(yǎng)訓(xùn)練(第六版)教案 第二單元 學(xué)習(xí)職業(yè)禮儀
- 2022年中華護(hù)理學(xué)會輸液連接裝置安全管理專家共識解讀
- 內(nèi)鏡下ESD護(hù)理配合
- DB34∕T 1644-2012 南方紅豆杉用材林栽培技術(shù)規(guī)程
- 直腸癌課件完整版本
- 2024年山東省青島市普通高中自主招生物理試卷(含解析)
- 胸部影像檢查護(hù)理常規(guī)
- 【Z精密零部件公司企業(yè)文化建設(shè)問題及優(yōu)化建議14000字(論文)】
- 2024-2030年紅茶行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
評論
0/150
提交評論