一、Activity的生命周期
1.Activity生命周期中的重要方法
(1)、onCreate():表示Activity已經(jīng)被創(chuàng)建。這是Activity生命周期中的第一個方法,Activity生命周期只執(zhí)行一次,可以在這個方法里做一些初始化工作,比如setContentView加載布局資源,初始化Activity所需要的數(shù)據(jù)等
(2)、onReStart():表示Activity重新被啟動。該方法可以被執(zhí)行多次,之后緊跟著onStart()。一般是Activity從不可見變?yōu)榭梢姇r調(diào)用。比如:Activity界面按home鍵或者重新打開一個新的Activity,當(dāng)前Activity就會停止,執(zhí)行onPause()和onStop()方法后,用戶又回到當(dāng)前Activity時會被調(diào)用。
(3)、onStart():表示Activity已經(jīng)創(chuàng)建完成,正在被啟動。這個方法表示Activity已經(jīng)是可見狀態(tài),但是沒有出現(xiàn)在前臺,用戶看不到,所以還不能和用戶進(jìn)行交互。該方法可以被執(zhí)行多次,一般是重現(xiàn)啟動時,在onReStart()后面被調(diào)用.
(4)、onResume():表示Activity已經(jīng)可見了。該方法說明Activity已經(jīng)在前臺顯示了,用戶可以看見了,并且交互了。該方法可以被執(zhí)行多次。
(5)、onPause():表示Activity正在停止,緊接著執(zhí)行下面onStop()方法。此時可以做一些數(shù)據(jù)存儲、動畫停止的任務(wù)。不能做太耗時任務(wù),會阻塞UI線程的,影響Activity的顯示。該方法適合onResume()相對的。該方法可以被執(zhí)行多次。
(6)、onStop():表示Activity即將停止。此時可以做一些輕量級資源回收的工作,單不能太耗時。該方法適合onStart()相對的。該方法可以被執(zhí)行多次。
(7)、onDestory():表示Activity即將被銷毀。這是Activity生命周期中的最后一個方法,Activity生命周期中只執(zhí)行一次,該方法適合onCreate()相對的??梢栽谠摲椒ㄖ凶鲑Y源的最終回收已經(jīng)釋放。
(7)、onReStart():表示Activity重新被啟動。該方法可以被執(zhí)行多次,之后緊跟著onStart()。一般是Activity從不可見變?yōu)榭梢姇r調(diào)用。比如:Activity界面按home鍵或者重新打開一個新的Activity,當(dāng)前Activity就會停止,執(zhí)行onPause()和onStop()方法后,用戶又回到當(dāng)前Activity時會被調(diào)用。
2、Activity的生命周期

(1)第一次啟動Activity,回調(diào)如下:onCreate-->onStart-->onResume。
(2)當(dāng)用戶打開新的Activity或者回到桌面時,回調(diào):onPause-->onStop(如果新的Activity是透明主題的話不會回調(diào)onStop)。
(3)用戶回到原Activity時,回調(diào)如下:onRestart-->onStart-->onResume.
(4)退出Activity是,回調(diào)如下:onPause-->onStop-->onDestroy.
(5)當(dāng)Activity被回收后,重新打開Activity時,是重新創(chuàng)建了Activity,回調(diào)和(1)一樣。
備注:有錯誤的地方,還望指正,共同進(jìn)步。
二、Activity的launchMode
(1)、standard:系統(tǒng)默認(rèn)的啟動模式。Activity在AndroidManifest中不設(shè)置launchMode屬性時,系統(tǒng)就會以standard的模式啟動Activity。該模式的Activity,每啟動一次就會創(chuàng)建一個新的實(shí)例,放到Activity的任務(wù)棧里,不管該Activity是否存在。
(2)、singleTop:棧頂復(fù)用模式。該模式下,新的Activity啟動時,如果在Activity的任務(wù)棧中已經(jīng)有該Activity的實(shí)例,并且位于棧頂,那么新的Activity就不會被重新創(chuàng)建,而是復(fù)用棧頂?shù)腁ctivity,同時回調(diào)棧頂Activity的onNewIntent方法。如果任務(wù)棧中該Activity的實(shí)例不位于棧頂或者沒有該Activity的實(shí)例,則創(chuàng)建新的Activity實(shí)例。
比如:Activity任務(wù)棧中有3個Activity實(shí)例A-B-C,Activity B和C的模式是singleTop。
? ? ? ?1、如果再次啟動C時,系統(tǒng)就不會創(chuàng)建Activity C的實(shí)例,而是直接調(diào)用Activity C的onNewIntent方法。此時任務(wù)棧中Activity實(shí)例是:A-B-C。
? ? ? ?2、如果再次啟動B時,由于B不位于棧頂,系統(tǒng)就會重新創(chuàng)建B的實(shí)例。此時任務(wù)棧中Activity的實(shí)例是:A-B-C-B。
(3)、singleTask:棧內(nèi)復(fù)用模式,該模式是一種單例模式。在這種模式下,只要Activity在一個任務(wù)棧中存在,那么不管啟動多少次該Activity都不會重新創(chuàng)建新的實(shí)例,而是回調(diào)onNewIntent方法。該模式還帶有clearTop效果,會把任務(wù)棧位于該Activity實(shí)例之上的所有Activity實(shí)例全部出棧。
比如:Activity任務(wù)棧S1中有3個Activity實(shí)例A-B-C,B的模式是singleTask,新的Activity實(shí)例D也是singleTask模式。
? ? ? ?1、如果啟動D,并且壓入到任務(wù)棧S1中。則創(chuàng)建新的實(shí)例D,壓入到S1中。此時S1中Activity的實(shí)例是:A-B-C-D。
? ? ? ?2、如果啟動的是實(shí)例B的話,并且壓入到任務(wù)棧S1中。則不會創(chuàng)建新的實(shí)例B,而是直接回調(diào)S1棧中的實(shí)例B的onNewIntent方法,并且把棧中實(shí)例B之上的C出棧。此時S1中Activity的實(shí)例是:A-B。
? ? ? 3、如果啟動的是實(shí)例B的話,并且壓入到任務(wù)棧S2中。系統(tǒng)就會查找有否存在S2,如果不存在,就創(chuàng)建S2,并不B壓入到S2,此時任務(wù)棧實(shí)例:S1任務(wù)棧{A-B-C}、S2任務(wù)棧{B}。如果S2存在,就查看S2中是否有實(shí)例B。若S2中不存在B,則創(chuàng)建并壓入S2任務(wù)棧中。若S2中存在B,則直接回調(diào)棧中的實(shí)例B的onNewIntent方法,并把棧中B之上的實(shí)例出棧。
(4)、singleInstance:單實(shí)例模式。是singleTask的升級版,不但包含了singleTask模式的特性外,還具有有一點(diǎn),只能單獨(dú)位于一個任務(wù)棧中。該模式的Activity第一次被啟動時,系統(tǒng)會為該Activity創(chuàng)建一個新的任務(wù)棧,該Activity獨(dú)自在這個任務(wù)棧中。由于站內(nèi)復(fù)用特性,后續(xù)不會創(chuàng)建新的該Activity實(shí)例。除非這個任務(wù)棧被銷毀。
三、Intent?Flags(或者Activity的Flags)
Flags:表示Intent的標(biāo)志位,常用于Activity的場景中,它和Activity的啟動模式有著密切的聯(lián)系。Flags優(yōu)先級高于AndroidManifest中的LaunchMode屬性。如果Activity A在AndroidManifest中設(shè)置了LaunchMode屬性,而且在啟動A時有添加了Flags標(biāo)志位,則已Flags標(biāo)志位為準(zhǔn)。
以下介紹幾種常見的Flags:
(1)、FLAG_ACTIVITY_NEW_TASK?
當(dāng)Intent對象包含這個標(biāo)記時,系統(tǒng)會尋找或創(chuàng)建一個新的task來放置目標(biāo)Activity,尋找時依據(jù)目標(biāo)Activity的taskAffinity屬性進(jìn)行匹配,如果找到一個task的taskAffinity與之相同,就將目標(biāo)Activity壓入此task中,如果查找無果,則創(chuàng)建一個新的task,并將該task的taskAffinity設(shè)置為目標(biāo)Activity的taskActivity,將目標(biāo)Activity放置于此task。注意,如果同一個應(yīng)用中Activity的taskAffinity都使用默認(rèn)值或都設(shè)置相同值時,應(yīng)用內(nèi)的Activity之間的跳轉(zhuǎn)使用這個標(biāo)記是沒有意義的,因?yàn)楫?dāng)前應(yīng)用task就是目標(biāo)Activity最好的宿主
FLAG_ACTIVITY_SINGLE_TOP
這個FLAG就相當(dāng)于啟動模式中的singletop,例如:原來?xiàng)V薪Y(jié)構(gòu)是A B C D,在D中啟動D,棧中的情況還是A,B,C,D。
FLAG_ACTIVITY_CLEAR_TOP
這個FLAG就相當(dāng)于啟動模式中的SingleTask,這種FLAG啟動的Activity會把要啟動的Activity之上的Activity全部彈出??臻g。例如:原來?xiàng)V械慕Y(jié)構(gòu)是A B C D ,從D中跳轉(zhuǎn)到B,棧中的結(jié)構(gòu)就變?yōu)榱薃 B了。(這個方法可以用來關(guān)閉多個Activity,之后的一篇博文里面會提到)
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個網(wǎng)上很多人是這樣寫的。如果activity在task存在,拿到最頂端,不會啟動新的Activity。這個有可能會誤導(dǎo)大家! 他這個FLAG其實(shí)是這個意思!比如說我現(xiàn)在有A,在A中啟動B,此時在A中Intent中加上這個標(biāo)記。此時B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式啟動,此時在B中再啟動C,D(正常啟動C,D),如果這個時候在D中再啟動B,這個時候最后的棧的情況是 A,C,D,B。如果在A,B,C,D正常啟動的話,不管B有沒有用FLAG_ACTIVITY_BROUGHT_TO_FRONT啟動,此時在D中啟動B的話,還是會變成A,C,D,B的。
FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作為activity周期的一部分,它在activity因?yàn)橛脩粢D(zhuǎn)到別的activity而要退到background時使用。比如,在用戶按下Home鍵,它將被調(diào)用。比如有電話進(jìn)來(不屬于用戶的選擇),它就不會被調(diào)用。
那么系統(tǒng)如何區(qū)分讓當(dāng)前activity退到background時使用是用戶的選擇?
它是根據(jù)促使當(dāng)前activity退到background的那個新啟動的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。
注意:調(diào)用finish()使該activity銷毀時不會調(diào)用該函數(shù)
FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個FLAG啟動的Activity,一旦退出,它不會存在于棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啟動D的,D再啟動E,這個時候棧中情況為A,B,C,E。
備注:有錯誤的地方,還望指正,共同進(jìn)步。