onStart 和onResume,onPause 和onStop從描述來看差不多,對我們來說有沒有實質(zhì)的不同呢?
實際使用過程來說,確實差不多,甚至可以只保留其中一對,而這兩哥配對的回調(diào)分別表示不同的意義,onStart和onStop是從Activity是否可見這個角度來回調(diào)的,而已onPause和onStop是從Activity是否位于前臺這個角度來回調(diào)的,除了這種區(qū)別,在實際使用中沒有其他明顯的區(qū)別。
假設(shè)當前Activity為A,如果這時用戶打開一個新ActivityB,那么B的onResume和A的onPause哪個先執(zhí)行呢?
A的onPause先執(zhí)行,B的onResume再執(zhí)行。官方文檔也解釋不能在onPause中做重量級的操作,因為onPause執(zhí)行完成后新的Activity才能Resume。通過分析,onPause和onStop都不能執(zhí)行耗時的操作,尤其是onPause,這也意味著,我們應(yīng)當盡量在onStop中做操作,從而使得新的Activity盡快顯示并切換到前臺。
Activity的LaunchMode啟動模式:
standard:標準模式,也是系統(tǒng)默認模式。每次啟動都會重新創(chuàng)建一個新的實例,不管這個實例是否存在。這種模式默認會進入啟動它的Activity所屬的任務(wù)棧,
singleTop:棧頂復(fù)用模式。這種模式下,如果新的Activity已經(jīng)位于任務(wù)棧的棧頂了,那么該Activity就不會重新創(chuàng)建,同時它的onNewIntent方法會被回調(diào),通過此方法的參數(shù),我們可以取出當前的請求信息。注意:這個Activity的onCreate、onStart不會被系統(tǒng)調(diào)用,因為它并沒有發(fā)生改變。如果新的Activity已經(jīng)存在,但是不是位于棧頂,那么它仍然會重建。
singleTask:棧內(nèi)復(fù)用模式,也是一種單實例模式。在這種模式下,只要Activity在一個棧中存在了,那么多次啟動此Activity都不會重新創(chuàng)建實例,和singleTop一樣,系統(tǒng)也會回調(diào)onNewIntent。同時singleTask默認具有clearTop的效果,這就會導(dǎo)致棧內(nèi)所有在該Activity上面的Activity全部出棧。
singleInstance:單實例模式。這是一種加強的singleTask模式,除了具有singleTask模式的特性外,還加強了一點,那就是具有此種模式的Activity只能單獨位于一個任務(wù)棧中。比如Activity A是singleTask模式,但A啟動后,系統(tǒng)會為它創(chuàng)建一個新的任務(wù)棧,然后A獨自在這個新的任務(wù)棧中,由于棧內(nèi)復(fù)用的特性,后續(xù)的請求都不會再創(chuàng)建新的Activity,除非這個獨特的任務(wù)棧被系統(tǒng)銷毀。
Activity的Flags有很多,常用的也就幾個:
FLAG_ACTIVITY_NEW_TASK: 此標志位的作用類似于Activity指定的“singleTask”啟動模式。
FLAG_ACTIVITY_SINGLE_TOP: 此標志位的作用類似于Activity指定的“singleTop”啟動模式。
FLAG_ACTIVITY_CLEAR_TOP: 具有此標志位的Activity,當它啟動的時候,在同一個任務(wù)棧中所有位于它上面的Activity都要出站,這個模式一般需要和FALG_ACTIVITY_NEW_TASK配合使用。在這種情況下被啟動的Activity已經(jīng)存在,那么系統(tǒng)就會調(diào)用它的onNewIntent。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 具有此標志位的Activity不會出現(xiàn)在歷史Activity的列表中,單某些情況下我們不希望用戶通過歷史列表回到我們的Activity的時候這個標記比較有用。它等同于在XML中指定Activity的屬性 android:excludeFromRecents="true" 。