【移動應(yīng)用開發(fā)技術(shù)】Activity啟動模式的示例分析_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Activity啟動模式的示例分析_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Activity啟動模式的示例分析_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Activity啟動模式的示例分析_第4頁
【移動應(yīng)用開發(fā)技術(shù)】Activity啟動模式的示例分析_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論