藝術(shù)探索第一章看完之后的總結(jié)和驗(yàn)證
A打開B:
onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)
乐横,onPause方法中不能執(zhí)行耗時(shí)操作贯涎,否則影響顯示效果介汹。在
onRestoreInstanceState
中恢復(fù)Bundle中數(shù)據(jù)和onCreate
中恢復(fù)的區(qū)別,onRestoreInstanceState
被調(diào)用鸭栖,Bundle
一定不為空,而onCreate
中傳入的Bundle
可能為空绪爸。onSaveInstance
調(diào)用的前提是蛉拙,這個(gè)Activity還會(huì)被顯示,如果正常銷毀是不會(huì)調(diào)用這個(gè)方法觉增,就像正常啟動(dòng)不會(huì)調(diào)用onRestoreInstanceState
一樣兵拢。當(dāng)設(shè)備配置發(fā)生改變的時(shí)候,Activity默認(rèn)會(huì)被重建逾礁,可以通過在XML中指定
configChanges
來阻止這種重建说铃,比較常見的有屏幕旋轉(zhuǎn)访惜。變化發(fā)生時(shí)候,onConfigurationChange
將被調(diào)用腻扇。用標(biāo)準(zhǔn)模式啟動(dòng)Activity债热,如果傳入的
非Activity類型的Context
,將報(bào)錯(cuò)幼苛。因?yàn)闃?biāo)準(zhǔn)模式下窒篱,新的Activity要放到啟動(dòng)它的Activity的任務(wù)棧中,而這種Context
沒有任務(wù)棧舶沿,所以會(huì)報(bào)錯(cuò)墙杯,解決方法,在啟動(dòng)的時(shí)候指定FLAG = FLAG_ACTIVITY_NEW_TASK
括荡。如何理解
FLAG_NEW_ACTIVITY_TASK
是一種SingleTask
模式啟動(dòng)? 我的理解是高镐,SingleTask
是棧內(nèi)復(fù)用,保證棧中只有一個(gè)實(shí)例畸冲。而指定FLAG_NEW_ACTIVITY_TASK
會(huì)自己創(chuàng)建棧避消,當(dāng)然只有一個(gè)實(shí)例。-
SingleTop
模式下召夹,A在棧頂調(diào)用自己岩喷。可見下圖监憎。即使是復(fù)用纱意,也是會(huì)先Pause自己,再Resume自己的鲸阔。中間調(diào)用onNewIntent
image.png -
SingleTask(A)調(diào)用standard(B)偷霉,再在B中調(diào)用A
。從下面的生命周期可以看見褐筛,第二次打開A的時(shí)候类少,先調(diào)用了A的onNewIntent
再執(zhí)行了A的Restart和Start
等方法,并且B被銷毀了渔扎。
看劃線處 SingleInstance
模式下硫狞,整個(gè)應(yīng)用只會(huì)創(chuàng)建一個(gè)實(shí)例,并且有自己獨(dú)立的棧晃痴。除非這里實(shí)例被銷毀残吩,否則不會(huì)創(chuàng)建實(shí)例。前臺任務(wù)棧
BA
倘核,后臺任務(wù)棧DC
泣侮,B
啟動(dòng)D
的時(shí)候,棧變成DCBA
紧唱,啟動(dòng)C
的時(shí)候變成了CBA
活尊,此時(shí)D被銷毀隶校。任務(wù)棧,參數(shù)
TaskAffinity
作為任務(wù)棧的標(biāo)識符蛹锰,可以在manifest.xml
中指定深胳。任務(wù)棧分為前臺任務(wù)棧
和后臺任務(wù)棧
。也就是問題9中情況宁仔。默認(rèn)的這個(gè)參數(shù)是包名。boolean allowTaskReparenting = true
時(shí)候峦睡。這個(gè)啟動(dòng)情況我相信大家都遇到過翎苫。別人把JD上的商品分享給你,你點(diǎn)開連接榨了,會(huì)自動(dòng)打開JD APP
中展示這個(gè)商品頁面煎谍,此時(shí)返回Home
,再去打開JD APP
龙屉。不會(huì)啟動(dòng)京東的主Activity
呐粘,而是啟動(dòng)剛才那個(gè)頁面。如果按back鍵转捕,那么直接退出JD了作岖。代碼中指定啟動(dòng)模式的優(yōu)先級比XML中定義要高。就像顯示
Intent
比隱式intent
優(yōu)先級高一樣五芝。一個(gè)activity可以有多個(gè)匹配規(guī)則
<intent-filter>
痘儡,每個(gè)規(guī)則中有多個(gè)action
,多個(gè)category
枢步,和若干data
沉删。
-
intent有且僅有一個(gè)
ACTION
,并且必須和filter匹配醉途》澹可以查看源碼,mAction
是一個(gè)String
類型的隘擎。intent
的action
不能有多個(gè)否則會(huì)覆蓋殴穴。
image.png Category(Intent)
是Category(intent-filter)
的子集。-
data
和ACTION
匹配規(guī)則一樣
image.png