android基本知識彙總結之android生命週期
1.Activity的生命週期
答:onCreate: 在這裏創建界面,做一些數據的初始化工作
onStart: 到這一步變成用戶可見不可交互的
onResume:變成和用戶可交互 的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,運行完彈出棧,則回到上一個Activity)
onPause: 到這一步是可見但不可交互的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這裏保存你的一些數據,因爲這個時候你的程序的優先級降低,有可能被系統收回。在這裏保存的數據,應該在
onstop: 變得不可見,被下一個activity覆蓋了
onDestroy: 這是activity被幹掉前最後一個被調用方法了,可能是外面類調用finish方法或者是系統爲了節省空間將它暫時性的幹掉。
2.橫豎屏切換時候的activity的生命週期
答:a. 新建一個activity,並把各個生命週期打印出
(1). 運行activity,得到如下信息:
onCreate()
onStart()
onResume()
(2). 按ctrl+F12切換成橫屏時
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
(3) .再按ctrl+f12切換成豎屏時,發現打印了兩次相同的Log
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
(5). 修改AndroidManifest.xml,把該Activity添加android:configChanges=“orientation”,執行步驟2
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
6) 修改AndroidManifest.xml,把該Activity添加android:configChanges=“orientation”,執行步驟3,發現不會再打印相同信息,但多打印了一行 onConfigurationChanged
onSaveInstanceState()
onPause()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
onConfigurationChanged()
7) 把步驟5的android:configChanges=“orientation”改成android:configChanges=“orientation|keyboradHidden”,執行步驟2,就只打印
onConfigurationChanged()
8) 把步驟5的android:configChanges=“orientation”改成android:configChanges=“orientation|keyboradHidden”,執行步驟3,就只打印
onConfigurationChanged()
onConfigurationChanged()
總結:
1).不設置activity的android:configChanges時,切橫屏時會執行一次,切豎屏時會執行兩次。
2).設置activity的android:configChanges=“orientation”時, 切屏會重新調用各個生命週期,切橫屏、豎屏時都只會執行一次,但是豎屏最後多打印 一條onConfigurationChanged()
3).設置activity的android:configChanges=“orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged(), 橫屏一次,豎屏兩次
總結下整個activity的生命週期:
1).當前activity產生事件彈出Toast和AlertDialog的時候Activity的生命週期不會有改變
2)Activity運行時按下HOME鍵(跟被完全覆蓋一樣的)
onSavaInstanceState
onPauseà
onStop
onRestart
onStart
onResume
3) 未被完全覆蓋,只是失去焦點:
onPause
onResume
3.說明onSaveInstanceState() 和 onRestoreInstanceState()在什麼時候被調用
答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法,它們並不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷燬一個Activity時,onSaveInstanceState()纔會被調用。但是當用戶主動去銷燬一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因爲在這種情況下,用戶的行爲決定了不需要保存Activity的狀態。通常onSaveInstanceState()只適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。
另外,當屏幕的方向發生了改變, Activity會被摧毀並且被重新創建,如果你想在Activity被摧毀前緩存一些數據,並且在Activity被重新創建後恢復緩存的數據。可以重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。