先上圖
由圖可知一個Activity的完整生命周期大致如下:
onCreate->onStart->onResume->onPause->onStop->onDestroy实柠,系統(tǒng)會在Activity進入相應狀態(tài)時調(diào)用相應方法携取,下面一個一個看看這些方法:
- ****onCreate()****
我們必須實現(xiàn)這個方法察净,系統(tǒng)在創(chuàng)建Activity的時候會調(diào)用這個方法厦酬。在這個方法中刺彩,我們一般會做些在整個生命周期中只會執(zhí)行一次的初始化邏輯锄禽。這個方法包含一個Bundle對象嘿般,這個對象存儲Activity被內(nèi)存殺死時的所有狀態(tài)和對象,當?shù)谝淮芜M入這個Activity時力麸,這個Bundle對象是null可款。 - ****onStart()****
當系統(tǒng)執(zhí)行這個方法后,Activity就對用戶可見了克蚂,但是這個時候用戶還不能操作界面闺鲸,在這個方法中一般會注冊廣播接收者。 - ****onResume()****
當執(zhí)行完這個方法后埃叭,這個時候用戶已經(jīng)能操作界面了摸恍,并且系統(tǒng)會保持這個狀態(tài)除非其他界面獲取了焦點(打開其他activity等)。 - ****onPause()****
系統(tǒng)會在用戶離開activity時調(diào)用這個方法(然而這不意味著activity被銷毀了)赤屋。我們可以使用這個方法去釋放資源立镶,一般在 onResume()初始化的資源都應該在這里銷毀。
onPause()方法的執(zhí)行是十分短的类早,所以在這里不適合做保存數(shù)據(jù)的操作媚媒。由于這個原因,我們不能在這里保存應用數(shù)據(jù)涩僻,使用網(wǎng)絡請求缭召,或者執(zhí)行數(shù)據(jù)庫操作。 - ****onStop()****
當應用對用戶來說不可見時會調(diào)用這個方法逆日,舉個例子恼琼,當另外一個activity完全遮擋住當前activity時,當前activity就會執(zhí)行這個方法屏富。在這個方法中晴竞,應用應該釋放大多數(shù)不再需要的資源,因為應用有可能不會執(zhí)行onDestroy方法狠半。 - ****onDestroy()****
當activity被銷毀之前調(diào)用噩死。這是activity收到的最后一次調(diào)用颤难。當用戶執(zhí)行finish()或者系統(tǒng)殺死進程的時候調(diào)用。當屏幕方向改變時也有可能會執(zhí)行這個方法已维。
在某些情況下的生命周期
- ****正常跳轉****
描述:打開Activity行嗤,然后由A跳轉到Activity B,然后再結束B垛耳。
結果:
首先打開A:A.onCreate->A.onStart->A.onResume
A跳轉到B:A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop
結束B:B.onPause->B.onStop->B.onDestroy->A.onStart->A.onResume
結論:在進入新的Activity時會先執(zhí)行本Activity的onPause方法栅屏,然后在新Activity完全可交互時執(zhí)行onStop方法。 - ****系統(tǒng)彈出AlertDialog(非全屏)****
描述:在Activity A中打開AlertDialog dialog,然后取消對話框
結果:打開dialog和關閉dialog未影響生命周期堂鲜。
結論:AlertDialog的顯示隱藏不影響生命周期栈雳。 - ****打開Dialog樣式的Activity(非全屏)****
描述:打開Activity,在Activity A中打開android:theme為對話框的Activity B缔莲,然后關閉B
首先打開A:A.onCreate->A.onStart->A.onResume
A跳轉到B:A.onPause->B.onCreate->B.onStart->B.onResume
結束B:B.onPause->B.onStop->B.onDestroy->A.onResume
結論:打開對話框樣式的Activity后本Activity只執(zhí)行onPause方法哥纫,并不會執(zhí)行onStop方法 - ****屏幕旋轉****
屏幕旋轉分兩種情況
1.未在Manifest文件中配置activity的configChange屬性。
描述:打開默認豎屏activity后旋轉屏幕至橫屏
生命周期:onCreate->onStart->onResume->onPause->onStop->onDestroy->onCreate->onStart->onResume
結論:未配置configChange屬性時旋轉屏幕會銷毀Activity并重新創(chuàng)建
2.覆蓋onConfigurationChanged方法并在Manifest中配置activity的configChange屬性如下
android:configChanges="screenSize|orientation|keyboardHidden"
描述:打開默認豎屏activity后旋轉屏幕至橫屏
生命周期:onCreate->onStart->onResume->onConfigurationChanged
結論:如果配置了configChange屬性并覆蓋了onConfigurationChanged方法痴奏,系統(tǒng)在旋轉屏幕的時候不會銷毀activity蛀骇,而是調(diào)用onConfigurationChanged方法