Activity疑難知識(shí)點(diǎn)

筆記來源:任玉剛《Android開發(fā)藝術(shù)探索》

一. Activity生命周期切換

Activity生命周期切換過程

二. 正常情況下的生命周期分析

2.1.onStart和onResume留凭,onPause和onStop的區(qū)別

onStart和onStop是從Activity \color{red}{是否可見}這個(gè)角度來回調(diào)的。
onResume和onPause是從Activity \color{red}{是否位于前臺(tái)}這個(gè)角度來回調(diào)的。
onStart的時(shí)候党窜,Activity可見但還在后臺(tái)(我們看不到)屉佳,onResume的時(shí)候Activity才顯示在前臺(tái)

2.2. 當(dāng)前Activity為A窃判,此時(shí)用戶打開一個(gè)新ActivityB,那么A的onPause和B的onResume哪個(gè)先執(zhí)行蜈亩?

必須A的onPause執(zhí)行完成以后,ActivityB才能啟動(dòng)

三. 異常情況下的生命周期分析

如橫豎屏切換前翎,默認(rèn)情況下稚配,Activity會(huì)被銷毀并重新創(chuàng)建,非默認(rèn)情況下港华,可以阻止系統(tǒng)重新創(chuàng)建Activity

異常情況下(默認(rèn)不做處理)Activity的重建過程

3.1. 用來保存當(dāng)前Activity的狀態(tài)道川,用來恢復(fù)。系統(tǒng)才會(huì)調(diào)用這兩個(gè)方法,其他情況不會(huì)觸發(fā)該過程
3.2 onSaveInstanceState在onStop之前調(diào)用冒萄,和onPause無時(shí)序關(guān)系臊岸。onRestoreInstanceState在onStart之后調(diào)用
3.3 當(dāng)AndroidMainfest.xml文件給Activity設(shè)置android:configChanges="orientation|screenSize|keyboardHidden"時(shí),Activity異常中止時(shí)不會(huì)重建Activity尊流,onSaveInstanceState和onRestoreInstanceState不會(huì)被調(diào)用帅戒,取而代之的是調(diào)用了onConfigurationChanged方法

四. Activity的啟動(dòng)模式

4.1 \color{red}{standard:標(biāo)準(zhǔn)模式。}
每次啟動(dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例崖技,不管這個(gè)實(shí)例是否已經(jīng)存在逻住。誰啟動(dòng)新Activity,新Activity就運(yùn)行在啟動(dòng)它的那個(gè)Activity的棧中
4.2 \color{red}{singleTop:棧頂復(fù)用模式迎献。}
如果新Activity已經(jīng)位于任務(wù)棧的棧頂瞎访,那么此Activity不會(huì)被重建,onCreate吁恍,onStart不會(huì)被調(diào)用装诡,其onNewIntent方法會(huì)被回調(diào)。如果棧內(nèi)為ABCD四個(gè)棧頂践盼,A位于棧底鸦采,D位于棧頂,再次啟動(dòng)D咕幻,如果D啟動(dòng)模式為singleTop渔伯,棧內(nèi)仍為ABCD,如果D是standard肄程,棧內(nèi)則為ABCDD
4.3 \color{red}{singleTask:棧內(nèi)復(fù)用模式锣吼。}
只要Activity在一個(gè)棧中存在,那么在該棧中就不會(huì)重新創(chuàng)建實(shí)例蓝厌,和singleTop一樣也會(huì)回調(diào)其onNewIntent玄叠。當(dāng)具有singleTask模式的Activity A請(qǐng)求啟動(dòng)后,系統(tǒng)首先會(huì)尋找是否存在A想要的任務(wù)棧拓提,如果不存在读恃,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建A的實(shí)例后把A放到棧中代态。如果存在A所需的任務(wù)棧寺惫,這時(shí)看A是否在棧中有實(shí)例存在,如果有蹦疑,就會(huì)把A調(diào)到棧頂并調(diào)用onNewIntent方法西雀,如果實(shí)例不存在,就創(chuàng)建A的實(shí)例并把A壓入棧中歉摧。
4.3 \color{red}{singleInstance:單實(shí)例模式艇肴。}
加強(qiáng)的singTask模式腔呜,除了具備singleTask模式的所有特性之外,具有此種模式的Activity只能單獨(dú)地位于一個(gè)任務(wù)棧中


任務(wù)棧:TaskAffinity

  • 該參數(shù)標(biāo)識(shí)了一個(gè)Activity所需要的任務(wù)棧的名字再悼,默認(rèn)情況下核畴,所有Activity所需的任務(wù)棧的名字為應(yīng)用的包名。
  • 我們也可以為每個(gè)Activity都單獨(dú)指定TaskAffinity屬性帮哈,但屬性值必須不能和包名相同膛檀,否則相當(dāng)于沒有指定。
  • TaskAffinity屬性主要和singleTask啟動(dòng)模式或者allowTaskReparenting屬性配對(duì)使用娘侍,在其他情況下沒有意義
  • 任務(wù)棧分為前臺(tái)任務(wù)棧和后臺(tái)任務(wù)棧咖刃,后臺(tái)任務(wù)棧中的Activity位于暫停狀態(tài),用戶可以通過切換后臺(tái)任務(wù)棧再次調(diào)到前臺(tái)
  • TaskAffinity和allowTaskReparenting結(jié)合時(shí)憾筏。有A和B兩個(gè)應(yīng)用嚎杨,A啟動(dòng)了B的一個(gè)Activity C,然后按Home鍵回到桌面氧腰,再點(diǎn)擊B的桌面圖標(biāo)枫浙,這個(gè)時(shí)候并不是啟動(dòng)了B的主Activity,二是重新顯示了被應(yīng)用A啟動(dòng)的Activity C古拴。即C從A的任務(wù)棧轉(zhuǎn)移到了B的任務(wù)棧中箩帚。

TaskAffinity使用: 通過AndroidMainfest為Activity指定任務(wù)棧 android:taskAffinity="taskName"


如何給Activity指定啟動(dòng)模式,兩種方法:
第一種通過AndroidMainfest為Activity指定啟動(dòng)模式黄痪,android:launchMode="singleTask"
第二種通過java代碼 Intent 中設(shè)置標(biāo)志位為Activity指定啟動(dòng)模式 Intent intent = new Intent(A.this,B.class) ;
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
第二種優(yōu)先級(jí)高于第一種紧帕,若兩種同時(shí)存在,以第二種為準(zhǔn)


五. IntentFilter的匹配規(guī)則

相關(guān)文章:https://blog.csdn.net/xiaohanluo/article/details/52637520

啟動(dòng)Activity分為兩種桅打,顯示調(diào)用和隱式調(diào)用是嗜。顯示調(diào)用即需要明確指定被啟動(dòng)對(duì)象的組件信息,包括包名和類名挺尾,而隱式調(diào)用則不需要明確指定組件信息鹅搪。如果一個(gè)Intent既是顯示又是隱式則以顯式調(diào)用為主。

隱式調(diào)用需要Intent能夠匹配目標(biāo)組件的IntentFilter中設(shè)置的過濾信息action遭铺,category丽柿,data。

一個(gè)過濾列表intent-filter中的action掂僵,category航厚,data可以有多個(gè),所有的action锰蓬,category,data分別構(gòu)成不同類別眯漩。只有一個(gè)Intent同時(shí)匹配action類別芹扭,category類別麻顶,data類別才算完全匹配,只有完全匹配才能成功啟動(dòng)目標(biāo)Activity
一個(gè)Activity可以有多個(gè)intent-filter舱卡,一個(gè)Intent只要能匹配任何一組intent-filter即可成功啟動(dòng)對(duì)應(yīng)的Activity辅肾。

action的匹配規(guī)則:要求Intent中的action存在且必須和過濾規(guī)則中的其中一個(gè)action相同。actoin區(qū)分大小寫轮锥。

category匹配規(guī)則:系統(tǒng)在調(diào)用startActivity或者startActivityForResult的時(shí)候會(huì)默認(rèn)為Intent加上"android.intent.category.DEFAULT"這個(gè)category矫钓。

通過隱式調(diào)用方式啟動(dòng)一個(gè)Activity的時(shí)候,需要做一下判斷舍杜,看是否有Activity能夠匹配我們的隱式Intent新娜,如果不做判斷,當(dāng)沒有匹配的時(shí)候就會(huì)崩潰報(bào)錯(cuò)既绩。判斷的方式有兩種:采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法概龄,如果找不到匹配的Activity就會(huì)返回null。

不含有DEFAULT這個(gè)category的Activity是無法接收隱式Intent的饲握。

<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
這兩者共同作用是用來標(biāo)明這是一個(gè)入口Activity并且會(huì)出現(xiàn)在系統(tǒng)的應(yīng)用列表中私杜,少了任何一個(gè)都沒有實(shí)際意義,也無法出現(xiàn)在系統(tǒng)的應(yīng)用列表中救欧,即二者缺一不可衰粹。
我們有時(shí)在一個(gè)應(yīng)用中,不小心給兩個(gè)以上的Activity添加了這兩個(gè)東西笆怠,我們就會(huì)發(fā)現(xiàn)桌面上就會(huì)有兩個(gè)以上該應(yīng)用的圖標(biāo)铝耻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骑疆,隨后出現(xiàn)的幾起案子田篇,更是在濱河造成了極大的恐慌,老刑警劉巖箍铭,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泊柬,死亡現(xiàn)場離奇詭異,居然都是意外死亡诈火,警方通過查閱死者的電腦和手機(jī)兽赁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冷守,“玉大人刀崖,你說我怎么就攤上這事∨囊。” “怎么了亮钦?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長充活。 經(jīng)常有香客問我蜂莉,道長蜡娶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任映穗,我火速辦了婚禮窖张,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚁滋。我一直安慰自己宿接,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布辕录。 她就那樣靜靜地躺著睦霎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪踏拜。 梳的紋絲不亂的頭發(fā)上碎赢,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音速梗,去河邊找鬼肮塞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姻锁,可吹牛的內(nèi)容都是我干的枕赵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼位隶,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼拷窜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涧黄,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤篮昧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后笋妥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懊昨,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年春宣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酵颁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡月帝,死狀恐怖躏惋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚷辅,我是刑警寧澤簿姨,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站簸搞,受9級(jí)特大地震影響款熬,放射性物質(zhì)發(fā)生泄漏深寥。R本人自食惡果不足惜攘乒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一贤牛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧则酝,春花似錦殉簸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爽雄,卻和暖如春蝠检,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挚瘟。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工叹谁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乘盖。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓焰檩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親订框。 傳聞我的和親對(duì)象是個(gè)殘疾皇子析苫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容