Activity生命周期

先上圖


activity_lifecycle.png

由圖可知一個Activity的完整生命周期大致如下:
onCreate->onStart->onResume->onPause->onStop->onDestroy,系統(tǒng)會在Activity進入相應(yīng)狀態(tài)時調(diào)用相應(yīng)方法,下面一個一個看看這些方法:

  • ****onCreate()****
    我們必須實現(xiàn)這個方法,系統(tǒng)在創(chuàng)建Activity的時候會調(diào)用這個方法。在這個方法中,我們一般會做些在整個生命周期中只會執(zhí)行一次的初始化邏輯。這個方法包含一個Bundle對象,這個對象存儲Activity被內(nèi)存殺死時的所有狀態(tài)和對象,當(dāng)?shù)谝淮芜M入這個Activity時,這個Bundle對象是null。
  • ****onStart()****
    當(dāng)系統(tǒng)執(zhí)行這個方法后,Activity就對用戶可見了,但是這個時候用戶還不能操作界面,在這個方法中一般會注冊廣播接收者。
  • ****onResume()****
    當(dāng)執(zhí)行完這個方法后,這個時候用戶已經(jīng)能操作界面了,并且系統(tǒng)會保持這個狀態(tài)除非其他界面獲取了焦點(打開其他activity等)。
  • ****onPause()****
    系統(tǒng)會在用戶離開activity時調(diào)用這個方法(然而這不意味著activity被銷毀了)。我們可以使用這個方法去釋放資源,一般在 onResume()初始化的資源都應(yīng)該在這里銷毀。
    onPause()方法的執(zhí)行是十分短的,所以在這里不適合做保存數(shù)據(jù)的操作。由于這個原因,我們不能在這里保存應(yīng)用數(shù)據(jù),使用網(wǎng)絡(luò)請求,或者執(zhí)行數(shù)據(jù)庫操作。
  • ****onStop()****
    當(dāng)應(yīng)用對用戶來說不可見時會調(diào)用這個方法,舉個例子,當(dāng)另外一個activity完全遮擋住當(dāng)前activity時,當(dāng)前activity就會執(zhí)行這個方法。在這個方法中,應(yīng)用應(yīng)該釋放大多數(shù)不再需要的資源,因為應(yīng)用有可能不會執(zhí)行onDestroy方法。
  • ****onDestroy()****
    當(dāng)activity被銷毀之前調(diào)用。這是activity收到的最后一次調(diào)用。當(dāng)用戶執(zhí)行finish()或者系統(tǒng)殺死進程的時候調(diào)用。當(dāng)屏幕方向改變時也有可能會執(zhí)行這個方法。

在某些情況下的生命周期

  • ****正常跳轉(zhuǎn)****
    描述:打開Activity,然后由A跳轉(zhuǎn)到Activity B,然后再結(jié)束B。
    結(jié)果:
    首先打開A:A.onCreate->A.onStart->A.onResume
    A跳轉(zhuǎn)到B:A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop
    結(jié)束B:B.onPause->B.onStop->B.onDestroy->A.onStart->A.onResume
    結(jié)論:在進入新的Activity時會先執(zhí)行本Activity的onPause方法,然后在新Activity完全可交互時執(zhí)行onStop方法。
  • ****系統(tǒng)彈出AlertDialog(非全屏)****
    描述:在Activity A中打開AlertDialog dialog,然后取消對話框
    結(jié)果:打開dialog和關(guān)閉dialog未影響生命周期。
    結(jié)論:AlertDialog的顯示隱藏不影響生命周期。
  • ****打開Dialog樣式的Activity(非全屏)****
    描述:打開Activity,在Activity A中打開android:theme為對話框的Activity B,然后關(guān)閉B
    首先打開A:A.onCreate->A.onStart->A.onResume
    A跳轉(zhuǎn)到B:A.onPause->B.onCreate->B.onStart->B.onResume
    結(jié)束B:B.onPause->B.onStop->B.onDestroy->A.onResume
    結(jié)論:打開對話框樣式的Activity后本Activity只執(zhí)行onPause方法,并不會執(zhí)行onStop方法
  • ****屏幕旋轉(zhuǎn)****
    屏幕旋轉(zhuǎn)分兩種情況
    1.未在Manifest文件中配置activity的configChange屬性。
    描述:打開默認(rèn)豎屏activity后旋轉(zhuǎn)屏幕至橫屏
    生命周期:onCreate->onStart->onResume->onPause->onStop->onDestroy->onCreate->onStart->onResume
    結(jié)論:未配置configChange屬性時旋轉(zhuǎn)屏幕會銷毀Activity并重新創(chuàng)建
    2.覆蓋onConfigurationChanged方法并在Manifest中配置activity的configChange屬性如下
    android:configChanges="screenSize|orientation|keyboardHidden"
    描述:打開默認(rèn)豎屏activity后旋轉(zhuǎn)屏幕至橫屏
    生命周期:onCreate->onStart->onResume->onConfigurationChanged
    結(jié)論:如果配置了configChange屬性并覆蓋了onConfigurationChanged方法,系統(tǒng)在旋轉(zhuǎn)屏幕的時候不會銷毀activity,而是調(diào)用onConfigurationChanged方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容