前言
以前學習的Android知識雜亂無章,形成不了一個完整的知識體系,因此打算根據知識星球的內容,完整的過一遍,首先來學習一下Activity。Activity是Android四大元件中最為重要的一個,負責直接與使用者互動,先來看看Activity的生命週期
一、生命週期
官方文件給出了下面這個圖
onCreate(Bundle)
是Activity中除了attachBaseContext
以外的第一個回撥方法,該方法一般用於呼叫setContentView
onStart()
當Activity可見時回撥,注意可見不代表Activity的UI被顯示出來,因為View的三大流程需要在onResume回撥完後才會開始onResume()
當Activity獲得了焦點後回撥(開始可以與使用者互動),同樣的,Activity的UI也沒被顯示出來,因此在該方法中直接獲取View的寬高拿到的都是0,回撥完該方法Activity就處於執行狀態了onPause()
當Activity失去了焦點後回撥,該方法後面可能會呼叫onStop、onResume或者可能被系統殺死onStop()
當Activity不可見時回撥,該方法後面可能會呼叫onDestory
、onRestart
或者可能被系統殺死onRestart()
當Activity處於stop狀態後,又被切換到的前臺時回撥,該方法後面緊跟著onStart回撥onDestroy()
當Activity將要被銷燬後呼叫,可能的情況是finish
方法被呼叫或者配置改變時(沒有配置configChange)時回撥,該回撥中可以做一些資源回收等操作
重點
- 當Activity A啟動一個透明的Activity或者一個Dialog主題的Activity時,A的onStop不會呼叫,因為其還可見
- 當Activity A開啟一個Dialog,不會呼叫A的任何生命週期方法
- 當Activity A開啟Activity B會呼叫A.onPause - B.onCreate - B.onStart - B.Resume - A.onStop(視情況,當A完全不可見時會呼叫)
- 當Activity A啟動Activity B然後點選back鍵會回撥B.onPause - (如果A處於stop狀態還有A.onRestart - A.start)A.onResume - B.onStop
- 當Activity A失去焦點後,當記憶體不足時系統可能會將A殺死,當點選回退後會呼叫A的onCreate - onStart - onResume進行重建
二、Fragment的生命週期與Activity的關係
首先來看看Fragment的生命週期
onAttach(Activity)
當Fragment與Activity建立聯絡時呼叫onCreate(Bundle)
當初始化建立Fragment的時候回撥onCreateView(LayoutInflate, ViewGroup, Bundle)
建立和返回Fragment顯示的根ViewonActivityCreated(Bundle)
當與Fragment相聯絡的Activity完成了onCreate回撥onStart()
當Fragment可見時回撥onResume()
當Fragment獲取焦點時回撥onPause()
當Fragment失去焦點時回撥onStop()
當Fragment不再可見時回撥onDestoryView()
用於清除與Fragment相關聯View的資源onDestory()
當Fragment將要被銷燬時呼叫onDetach()
當呼叫該方法後Fragment就與Activity失去聯絡了
將設有Activity A在onCreate通過Replace方顯示了Fragment F,生命週期呼叫順序為A.onCreate - A.onStart - F.onAttach - F.onCreate - F.onCreateView - F.onViewCreate - F.onActivityCreate - F.onStart - A.onResume - F.onResume
三、Activity與menu建立先後順序
在Activity的onResume
呼叫完後會回撥onCreateOptionMenu
來建立Menu
四、使用onSavedInstanceState()和onRestoreInstanceState()儲存狀態
-
onSavedInstanceState
當Activity被意外的殺死或者是當配置方式改變後會回撥onSavedInstanceState(在API28及以上其呼叫時機在onStop之後,在API28之前呼叫時機onStop之前與onPause無時序關係) -
onRestoreInstanceState
再次啟動後我們可以在onRestoreInstanceState中恢復onSavedInstanceState儲存的資料