Activity的生命週期
正常的activity創建的過程中會經歷如下生命週期:
- onCreate:表示Activity正在被創建,這是生命週期的第一個方法。在這個方法中,我們可以做一些初始化工作,比如調用setContentView去加載界面佈局資源、初始化activity中所需數據等
- onRestart:表示activity正在重新啓動。一般情況下,噹噹前activity從不可見重新變爲可見狀態時,onRestart就會被調用。這種情形一般是用戶行爲導致的,比如用戶按Home鍵切換到桌面或者用戶打開了一個新的Activity,這時當前的activity就會暫停,也就是onPause和onStop被執行了,接着用戶又回到了這個activity,就會出現這種情況。
- onStart:表示activity正在被啓動,即將開始,這時Activity已經可見了,但是還沒有出現在前臺,還無法和用戶交互。這個時候其實可以理解爲Activity已經顯現出來了,我們還看不到。
- onResume:表示activity已經可見了,並且出現在前臺並開始活動。要注意這個和onStart的對比,onResume時纔可以進到前臺,纔可以進行操作。
- onPause:表示activity正在停止,正常情況下,緊接着onStop就會被調用。在特殊的情況下,如果這個時候快速的再回到當前activity,那麼onResume就會被調用。此處可以做一些存儲數據,停止動畫等工作。
- onStop:表示activity即將停止,可以做一些稍微重量級的回收工作,注意不要太耗時。
- onDestory:表示activity即將銷燬,這是activity生命週期中最後一個回調,在這裏可以做一些回收工作和最終的資源的釋放。
放一張圖,比較清晰地看出流程脈絡
注意:如果新打開的activity採用的是透明主題,那麼當前activity的onStop方法不會被回調。
異常情況下:
1.資源相關配置改變下的改變:
onSaveInstanceState方法,發生在onStop之前;onRestoreInstanceState方法,發生在onStart之前。
2.資源內存不足導致的低優先級的activity被殺死:
Activity的啓動模式
- standard:
標準模式,也是系統默認的啓動模式。每次啓動一個activity的時候,都會重新創建一個實例,它的onCreate,onStart,onResume都會被調用一遍。 - singleTop:棧頂複用模式。
在這種模式下,如果新的activity已經位於任務棧的棧頂,那麼此activity不會被重新創建,同事它的onNewIntent()會被調用,通過此方法,我們可以取出我們當前請求的信息。需要指出的是:這個activity的onCreate和onStart並不會被系統調用,因爲它並未發生改變。
如果新的activity的實例已經存在,但並沒有位於棧頂,那麼新的activity依然會被創建。 - singleTask:棧內複用模式。
這是一種單實例模式。只要activity再一個棧中存在,那麼多次啓動此activity都不會重新創建實例,和singTop一樣,系統會回調onNewInstance。如果啓動的activity所在的棧不處於棧頂,則會默認執行clearTop的效果,即在所啓動的activity的棧之上的棧,全部清除,並把所啓動的activity置於棧頂。 - singleInstance:單實例模式
這是一種加強版的singleTask,它除了具有singTask所有的特性外,還加強了一點,那就是具有此模式的activity智能單獨的位於一個任務棧中,換句話說,比如activitA是singleInstance模式的,那麼當A啓動後,系統會爲它單獨創建一個任務棧,由於棧內的複用性,後續的創建請求均不會創建新的activity,除非這個獨特的任務棧被系統銷燬了。
給activity指定啓動模式:
- 通過AndroidMenifest:
<activity
android:name=".activity.MyOrderStateActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
- 通過在Intent中設置標誌位:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
-
優先級上:
第二種高於第一種,兩種同時存在時,以第二種爲準。
-
限定範圍:
第一種無法直接爲activity設定爲FLAG_ACTIVITY_CLEAR_TOP標識, 第二種無法爲activity指定singleInstance模式。