第1章 Activity的生命周期和啟動(dòng)模式

Activity生命周期

  1. onCreate: 表示Activity正在創(chuàng)建
  2. onRestart: 表示Activity正在重新啟動(dòng)。 從nonstop狀態(tài)恢復(fù)的時(shí)候會(huì)調(diào)用onRestart
  3. onStart : 表示Activity正在被啟動(dòng)。這是Activity已經(jīng)可見,但是還沒(méi)出現(xiàn)在前臺(tái)
  4. onResume: 表示Activity已經(jīng)可見,并且出現(xiàn)在前臺(tái)開始活動(dòng)。
  5. onPause: 表示Activity正在被停止,正常情況下onStop會(huì)很快被調(diào)用
  6. onStop : 表示Activity即將停止,可以做一些稍微重量級(jí)的回收工作,同時(shí)不能太耗時(shí)
  7. onDestroy: 表示Activity即將被銷毀,這是Activity種的最后一個(gè)回調(diào),在這里,我們尅做一些回收工作和資源釋放
0_1314838777He6C.gif.png

(1)針對(duì)一個(gè)特定的Activity,第一次啟動(dòng),回調(diào) :onCreate - onStart - onResume

(2) 打開新的Activity或者切換到桌面的時(shí)候回調(diào):onPause- onStop 。特殊情況,如果新Activity采用透明主題,那么當(dāng)前Activity不會(huì)回調(diào)onStop

(3)當(dāng)用戶再次回到原Activity的時(shí)候 回調(diào):onResetart - onStrat - onRsume

(4) 當(dāng)用戶按back鍵回退時(shí),回調(diào) onPause - onStop - onDestroy

(5) 當(dāng)Activity被系統(tǒng)回收后再次打開,生命周期回調(diào)和(1)一致 。注意只是生命周期一致,但不是所有過(guò)程都一樣。

(6)從整個(gè)證明周期看來(lái) onCreate和onDestroy是配對(duì)的,分別標(biāo)識(shí)著Activity的創(chuàng)建和銷毀,并且只可能有一次調(diào)用。從Activity是否可見來(lái)說(shuō)onstant和onStop是配對(duì)的,隨著用戶的操作或者設(shè)備屏幕的點(diǎn)亮和熄滅,這兩個(gè)方法可能被調(diào)用多次。從Activity是否在前臺(tái)來(lái)說(shuō),onResume和onPause是配對(duì)的,隨著用戶操作或者設(shè)備屏幕的點(diǎn)亮和熄滅,這兩個(gè)方法可能被調(diào)用多次

問(wèn)題1: onStart和onResume,onPause和onStop從描述上看來(lái)差不多,對(duì)我們來(lái)說(shuō)有什么實(shí)質(zhì)的不同

答案:每個(gè)回調(diào)代表不同的意義onstart和onStop是從Activity是否可見這個(gè)角度來(lái)回調(diào)的,onResume和onPause是從Activity是否位于前臺(tái)這個(gè)角度來(lái)回調(diào)的。除了這個(gè)區(qū)別,在實(shí)際使用中沒(méi)有其他明顯的區(qū)別

問(wèn)題2:當(dāng)前Activity為A,如果這時(shí)用戶打開一個(gè)新Activity B,那么B的onResume和A的onPause哪個(gè)先執(zhí)行

答案: 先執(zhí)行 A的on pause,在執(zhí)行B的onResume。

當(dāng)ActivityA打開后打開ActivityB 生命周期是 A onPause B onCreate onStart onResume A onStop

1.1.2 異常情況下生命周期分析

當(dāng)橫豎屏幕切換的時(shí)候 Activity會(huì)被銷毀。其onPause,onStop,onDestroy 均會(huì)被調(diào)用。異常情況下終止會(huì)調(diào)用onSaveInstanceState來(lái)保存當(dāng)前Activity的狀態(tài)。這個(gè)方法調(diào)用時(shí)機(jī)是在onStop之前。Activity銷毀重新創(chuàng)建后,系統(tǒng)會(huì)調(diào)用onRestoreInstanceState,并把Activity銷毀時(shí)onSaveInstanceState方法保存的Bundle對(duì)象作為參數(shù)同時(shí)傳遞給onCreate和onRestoreInstanceState方法,在這里我們可以取出保存的數(shù)據(jù)。onRestoreInstanceState在onStart之后。

Activity優(yōu)先級(jí)

1.前臺(tái)的Activity 2.可見但并非前臺(tái)的Activity 3.后臺(tái)Activity

如果不想屏幕旋轉(zhuǎn)時(shí)系統(tǒng)重新創(chuàng)建可以給configChanges屬性添加orientation這個(gè)值

android:configChanges=“orientation|screenSize" 

這時(shí)候旋屏幕Activity不會(huì)重現(xiàn)創(chuàng)建 也沒(méi)有調(diào)用onSaveInstanceState和onRestoreInstanceState來(lái)存儲(chǔ)和恢復(fù)數(shù)據(jù),取而代之的是調(diào)用了Activity的onConfigurationChange方法

1.2 Activity的啟動(dòng)模式

啟動(dòng)模式 : standard singleTop singleTask singleInstance

  1. standard:標(biāo)準(zhǔn)模式 每次啟動(dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例。這種模式下,誰(shuí)啟動(dòng)這個(gè)Activity,他就運(yùn)行在啟動(dòng)它的那個(gè)Activity所在的棧里。

用ApplicationContext去啟動(dòng)standard模式的Activity的時(shí)候會(huì)報(bào)錯(cuò) startActivity from aside of an Activity context require the FLAG_ACTIVITY_NEW_TASK flag.Is this really what your want

這是因?yàn)閟tandard模式的Activity默認(rèn)會(huì)進(jìn)入啟動(dòng)它的Activity所屬的任務(wù)棧中,但是由于非Activity類型的Context(ApplicationContext) 并沒(méi)有所謂的任務(wù)棧,所以就出現(xiàn)問(wèn)題了。解決這個(gè)問(wèn)題的方法是為待啟動(dòng)的Activity制定 FLAG_ACTIVITY_NEW_TASK 標(biāo)記位。這樣啟動(dòng)的時(shí)候就會(huì)為他創(chuàng)建一個(gè)新的任務(wù)棧。這個(gè)時(shí)候待啟動(dòng)的Activity實(shí)際上是以singleTask模式啟動(dòng)的。

2.singleTop :棧頂復(fù)用模式,在這個(gè)模式下,如果新的Activity已經(jīng)位于任務(wù)棧的棧頂,那么此activity不會(huì)被重新創(chuàng)建,同事它的onNewIntent方法會(huì)被回調(diào),

3.singleTask:棧內(nèi)復(fù)用模式,這是一種單實(shí)例模式,在這種模式下,只要Activity在一個(gè)棧中存在,那么多次啟動(dòng)此Activity都不會(huì)重現(xiàn)創(chuàng)建實(shí)例,和singleTop一樣,系統(tǒng)也會(huì)回調(diào)其onNewIntent

4.singleInstance 單實(shí)例模式 一種加強(qiáng)的singletask模式,他具有singleTask模式的所有特點(diǎn),還加強(qiáng)了一點(diǎn),那就是具有此種模式的Activity只能單獨(dú)的位于一個(gè)任務(wù)棧中。

什么是activity所需的任務(wù)棧。設(shè)計(jì)到一個(gè)參數(shù)TaskAffinity??梢苑g為任務(wù)相關(guān)性。這個(gè)參數(shù)標(biāo)識(shí)一個(gè)Activity所需要的任務(wù)棧的名字。默認(rèn)情況下,所有Activity所需的任務(wù)棧的名字為應(yīng)用的包名。當(dāng)然也可以為每個(gè)activity單獨(dú)制定TaskAffinity屬性。 任務(wù)棧分為前臺(tái)任務(wù)棧和后臺(tái)任務(wù)棧。

Activity的Flags

FLAG_ACTIVITY_NEW_TASK 這個(gè)標(biāo)志位的作用是為Activity指定“singleTask”啟動(dòng)模式,其效果個(gè)在XML中指定該啟動(dòng)模式相同。

FLAG_ACTIVITY_SINGLE_TOP 這個(gè)標(biāo)志位的總用是為Activity指定singleTop的啟動(dòng)模式,其效果和在XML中指定該啟動(dòng)模式相同

FLAG_ACTIVITY_CLEAR_TOP 具有此標(biāo)記為的Activity,當(dāng)他啟動(dòng)時(shí),同一個(gè)任務(wù)棧中所有位于它上面的Activity都要出棧。這個(gè)標(biāo)志位一般和FLAG_ACTIVITY_NEW_TASK配合使用,在這種情況下,被啟動(dòng)的Activity的實(shí)例如果已經(jīng)存在,那么系統(tǒng)會(huì)調(diào)用他的onNewIntent,如果被啟動(dòng)的Activity采用的是standard模式,那么他自己和它智商的Activity都要出棧,系統(tǒng)會(huì)創(chuàng)建新的Activity實(shí)例并放入棧頂。

FLAG_ACTIVITY_EXCLUDE_FORM_RECENTS 具有這個(gè)標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Activity的列表中,當(dāng)某些情況下我們不希望用戶通過(guò)歷史列表回到我們的Activity的時(shí)候這個(gè)標(biāo)記比較有用。它等同于在XML中指定的Activity的屬性android:excludeFormRencents = “true"

1.3 IntentFilter的匹配規(guī)則

啟動(dòng)Activity分為兩種 ,顯式調(diào)用和隱式調(diào)用

IntentFilter中的過(guò)濾信息有action,category,data.下面是過(guò)濾規(guī)則:

為了匹配過(guò)濾列表,需要同時(shí)匹配過(guò)濾列表中的action,category,data信息,否則匹配失敗。

action的匹配規(guī)則:

action是一個(gè)字符串,系統(tǒng)預(yù)定義一些action,同時(shí)我們也可以應(yīng)用中定義自己的action。action匹配規(guī)則是Intent中的action必須能夠和過(guò)濾規(guī)則中的action匹配。一個(gè)過(guò)濾規(guī)則中可以有多個(gè)action,那么只要Intent中的action能夠和過(guò)濾規(guī)則中任何一個(gè)action相同即可匹配成功。如果Intent中沒(méi)有指定action,那么匹配失敗。總結(jié)一下,action的匹配要求intent中的action存在并且必須和過(guò)濾規(guī)則中的其中一個(gè)action相同。區(qū)分大小寫

category的匹配規(guī)則:

category要求如果intent中出現(xiàn)了category,不管有幾個(gè)category,對(duì)于每個(gè)category來(lái)說(shuō),他必須是過(guò)濾規(guī)則中已經(jīng)定義的category。當(dāng)然intent中可以沒(méi)有category。action要求intent中必須有一個(gè)action且必須能夠和過(guò)濾規(guī)則中的任何一個(gè)category相同,而category要求intent可以沒(méi)有category,一旦有category,不管有幾個(gè),每個(gè)都要能夠和過(guò)濾規(guī)則中任何一個(gè)category相同。為什么不設(shè)置category也會(huì)匹配成功,是因?yàn)閕ntent會(huì)默認(rèn)加上“android.intent.category.DEFAULT”這個(gè)category,同時(shí),為了我們的activity能接受隱式調(diào)用,就必須在intent-filter中指定“android.intent.category.DEFAULT”這個(gè)category。

data匹配規(guī)則:

data的匹配規(guī)則和action類似,如果過(guò)濾規(guī)則中定義的data,那么intent重也必須定義可匹配的data。要求intent中必須含有data數(shù)據(jù),并且data數(shù)據(jù)能夠完全匹配過(guò)濾規(guī)則中的某一個(gè)data

data語(yǔ)法:<data android:scheme=“string” android:host=“string” android:port=‘string’ android:path=“string” android:pathPattern=“string” android:pathPrefix=“string” android:mimeType=“string" />

例如 content://com.example.project:200/folder/subfolder/etc

    [http://www.baidu.com:80/search/info](http://www.baidu.com:80/search/info)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容