Activity的生命周期以及Activity的launchMode

一、Activity的生命周期

1.Activity生命周期中的重要方法

(1)、onCreate():表示Activity已經被創建。這是Activity生命周期中的第一個方法,Activity生命周期只執行一次,可以在這個方法里做一些初始化工作,比如setContentView加載布局資源,初始化Activity所需要的數據等

(2)、onReStart():表示Activity重新被啟動。該方法可以被執行多次,之后緊跟著onStart()。一般是Activity從不可見變為可見時調用。比如:Activity界面按home鍵或者重新打開一個新的Activity,當前Activity就會停止,執行onPause()和onStop()方法后,用戶又回到當前Activity時會被調用。

(3)、onStart():表示Activity已經創建完成,正在被啟動。這個方法表示Activity已經是可見狀態,但是沒有出現在前臺,用戶看不到,所以還不能和用戶進行交互。該方法可以被執行多次,一般是重現啟動時,在onReStart()后面被調用.

(4)、onResume():表示Activity已經可見了。該方法說明Activity已經在前臺顯示了,用戶可以看見了,并且交互了。該方法可以被執行多次。

(5)、onPause():表示Activity正在停止,緊接著執行下面onStop()方法。此時可以做一些數據存儲、動畫停止的任務。不能做太耗時任務,會阻塞UI線程的,影響Activity的顯示。該方法適合onResume()相對的。該方法可以被執行多次。

(6)、onStop():表示Activity即將停止。此時可以做一些輕量級資源回收的工作,單不能太耗時。該方法適合onStart()相對的。該方法可以被執行多次。

(7)、onDestory():表示Activity即將被銷毀。這是Activity生命周期中的最后一個方法,Activity生命周期中只執行一次,該方法適合onCreate()相對的??梢栽谠摲椒ㄖ凶鲑Y源的最終回收已經釋放。

(7)、onReStart():表示Activity重新被啟動。該方法可以被執行多次,之后緊跟著onStart()。一般是Activity從不可見變為可見時調用。比如:Activity界面按home鍵或者重新打開一個新的Activity,當前Activity就會停止,執行onPause()和onStop()方法后,用戶又回到當前Activity時會被調用。

2、Activity的生命周期


(1)第一次啟動Activity,回調如下:onCreate-->onStart-->onResume。

(2)當用戶打開新的Activity或者回到桌面時,回調:onPause-->onStop(如果新的Activity是透明主題的話不會回調onStop)。

(3)用戶回到原Activity時,回調如下:onRestart-->onStart-->onResume.

(4)退出Activity是,回調如下:onPause-->onStop-->onDestroy.

(5)當Activity被回收后,重新打開Activity時,是重新創建了Activity,回調和(1)一樣。

備注:有錯誤的地方,還望指正,共同進步。

二、Activity的launchMode

(1)、standard:系統默認的啟動模式。Activity在AndroidManifest中不設置launchMode屬性時,系統就會以standard的模式啟動Activity。該模式的Activity,每啟動一次就會創建一個新的實例,放到Activity的任務棧里,不管該Activity是否存在。

(2)、singleTop:棧頂復用模式。該模式下,新的Activity啟動時,如果在Activity的任務棧中已經有該Activity的實例,并且位于棧頂,那么新的Activity就不會被重新創建,而是復用棧頂的Activity,同時回調棧頂Activity的onNewIntent方法。如果任務棧中該Activity的實例不位于棧頂或者沒有該Activity的實例,則創建新的Activity實例。

比如:Activity任務棧中有3個Activity實例A-B-C,Activity B和C的模式是singleTop。

? ? ? ?1、如果再次啟動C時,系統就不會創建Activity C的實例,而是直接調用Activity C的onNewIntent方法。此時任務棧中Activity實例是:A-B-C。

? ? ? ?2、如果再次啟動B時,由于B不位于棧頂,系統就會重新創建B的實例。此時任務棧中Activity的實例是:A-B-C-B。

(3)、singleTask:棧內復用模式,該模式是一種單例模式。在這種模式下,只要Activity在一個任務棧中存在,那么不管啟動多少次該Activity都不會重新創建新的實例,而是回調onNewIntent方法。該模式還帶有clearTop效果,會把任務棧位于該Activity實例之上的所有Activity實例全部出棧。

比如:Activity任務棧S1中有3個Activity實例A-B-C,B的模式是singleTask,新的Activity實例D也是singleTask模式。

? ? ? ?1、如果啟動D,并且壓入到任務棧S1中。則創建新的實例D,壓入到S1中。此時S1中Activity的實例是:A-B-C-D。

? ? ? ?2、如果啟動的是實例B的話,并且壓入到任務棧S1中。則不會創建新的實例B,而是直接回調S1棧中的實例B的onNewIntent方法,并且把棧中實例B之上的C出棧。此時S1中Activity的實例是:A-B。

? ? ? 3、如果啟動的是實例B的話,并且壓入到任務棧S2中。系統就會查找有否存在S2,如果不存在,就創建S2,并不B壓入到S2,此時任務棧實例:S1任務棧{A-B-C}、S2任務棧{B}。如果S2存在,就查看S2中是否有實例B。若S2中不存在B,則創建并壓入S2任務棧中。若S2中存在B,則直接回調棧中的實例B的onNewIntent方法,并把棧中B之上的實例出棧。

(4)、singleInstance:單實例模式。是singleTask的升級版,不但包含了singleTask模式的特性外,還具有有一點,只能單獨位于一個任務棧中。該模式的Activity第一次被啟動時,系統會為該Activity創建一個新的任務棧,該Activity獨自在這個任務棧中。由于站內復用特性,后續不會創建新的該Activity實例。除非這個任務棧被銷毀。

三、Intent?Flags(或者Activity的Flags)

Flags:表示Intent的標志位,常用于Activity的場景中,它和Activity的啟動模式有著密切的聯系。Flags優先級高于AndroidManifest中的LaunchMode屬性。如果Activity A在AndroidManifest中設置了LaunchMode屬性,而且在啟動A時有添加了Flags標志位,則已Flags標志位為準。

以下介紹幾種常見的Flags:

(1)、FLAG_ACTIVITY_NEW_TASK?

當Intent對象包含這個標記時,系統會尋找或創建一個新的task來放置目標Activity,尋找時依據目標Activity的taskAffinity屬性進行匹配,如果找到一個task的taskAffinity與之相同,就將目標Activity壓入此task中,如果查找無果,則創建一個新的task,并將該task的taskAffinity設置為目標Activity的taskActivity,將目標Activity放置于此task。注意,如果同一個應用中Activity的taskAffinity都使用默認值或都設置相同值時,應用內的Activity之間的跳轉使用這個標記是沒有意義的,因為當前應用task就是目標Activity最好的宿主

FLAG_ACTIVITY_SINGLE_TOP

這個FLAG就相當于啟動模式中的singletop,例如:原來棧中結構是A B C D,在D中啟動D,棧中的情況還是A,B,C,D。

FLAG_ACTIVITY_CLEAR_TOP

這個FLAG就相當于啟動模式中的SingleTask,這種FLAG啟動的Activity會把要啟動的Activity之上的Activity全部彈出棧空間。例如:原來棧中的結構是A B C D ,從D中跳轉到B,棧中的結構就變為了A B了。(這個方法可以用來關閉多個Activity,之后的一篇博文里面會提到)

FLAG_ACTIVITY_BROUGHT_TO_FRONT

這個網上很多人是這樣寫的。如果activity在task存在,拿到最頂端,不會啟動新的Activity。這個有可能會誤導大家! 他這個FLAG其實是這個意思!比如說我現在有A,在A中啟動B,此時在A中Intent中加上這個標記。此時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因為用戶要跳轉到別的activity而要退到background時使用。比如,在用戶按下Home鍵,它將被調用。比如有電話進來(不屬于用戶的選擇),它就不會被調用。

那么系統如何區分讓當前activity退到background時使用是用戶的選擇?

它是根據促使當前activity退到background的那個新啟動的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。

注意:調用finish()使該activity銷毀時不會調用該函數

FLAG_ACTIVITY_NO_HISTORY

意思就是說用這個FLAG啟動的Activity,一旦退出,它不會存在于棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啟動D的,D再啟動E,這個時候棧中情況為A,B,C,E。


備注:有錯誤的地方,還望指正,共同進步。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容