複習 activity 的生命週期 手機鎖屏時生命週期變化
onCreat() 不可見不可互動 建立時呼叫
onStart()是activity介面被顯示出來的時候執行的,使用者可見,包括有一個activity在他上面,但沒有將它完全覆蓋,使用者可以看到部分activity但不能與它互動 建立時或者從後臺重新回到前臺時呼叫
下面這三個狀態是靜態(static)的,意味著activity只有在這三個狀態下能停留一段時間:
onResume()是該activity與使用者能進行互動時被執行,使用者可以獲得activity的焦點,能夠與使用者互動。
建立或者從被覆蓋、後臺重新回到前臺時被呼叫
onPause() 可見不可互動(部分可見),不能接收使用者輸入也不能執行程式碼,另一個半透明或者小的activity正擋在前面。
被覆蓋到下面或者鎖屏時被呼叫
onStop() 不可見不可互動失去焦點,activity完全被遮擋,不能被使用者看到,activity被認為在background,當Stopped的時候,activity例項的狀態資訊被保留,但是不能執行任何程式碼。
退出當前Activity或者跳轉到新Activity時被呼叫
onRestart() 從不可見到可見
onDestory() 銷燬activity 退出當前Activity時被呼叫,呼叫之後Activity就結束了
還是上圖吧:
介紹一下集中情況的生命週期的呼叫,我在Myapplication添加了監測activity生命週期的回撥方法(可參考http://blog.csdn.net/tongcpp/article/details/40344871),最近在看kotlin 所以不是用的Java程式碼,不過測試程式碼很簡單,這裡就不轉為Java來看了,看一下我的application程式碼
onRestart() 方法在這個回撥中沒有就新增到了activity內部
class Myapplication : Application() { override fun onCreate() { super.onCreate() this.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { override fun onActivityResumed(activity: Activity?) { /** * 打印出activity的名稱和生命週期方法 */ Log.e("Activity Life", "${activity?.localClassName} onActivityResumed ") } override fun onActivityStarted(activity: Activity?) { Log.e("Activity Life", "${activity?.localClassName} onActivityStarted") } override fun onActivityDestroyed(activity: Activity?) { Log.e("Activity Life", "${activity?.localClassName} onActivityDestroyed") } override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) { Log.e("Activity Life", "${activity?.localClassName} onActivitySaveInstanceState") } override fun onActivityStopped(activity: Activity?) { Log.e("Activity Life", "${activity?.localClassName} onActivityStopped") } override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) { Log.e("Activity Life", "${activity?.localClassName} onActivityCreated") } override fun onActivityPaused(activity: Activity?) { Log.e("Activity Life", "${activity?.localClassName} onActivityPaused") } }) } }
目前我的MainActivity隨便寫了點程式碼,啟動APP,看日誌
情景一:啟動MainActivity 的時候呼叫的生命週期方法結果如下
create--->start--->resume
情景二(三星手機為例):此時手機進入鎖屏狀態呼叫的生命週期方法結果如下
pause--->stop
隨後開啟鎖屏
restart--->start--->resume
其它:鎖屏時只會呼叫onPause(),而不會呼叫onStop方法,開屏後則呼叫onResume()
情景三:直接按home返回主介面
pause--->stop
再次開啟app
restart--->start---resume
情景四:按back鍵返回主介面
puse--->stop--->destory
這是可以看到activity直接銷燬了,毫無疑問再次開啟APP的時候activity就呼叫了和情況一啟動是相同的方法
情景五:啟動另一個activity
可以看見MainActivity首先進入pause狀態,新activity啟動,原activity進入stop狀態,此時按back鍵返回MainActivity
情景六:在MainActivity執行狀態下有電話打來,生命週期是如何呼叫的呢?下面看一下測試結果
結束通話電話後回到該介面呼叫的方法
restart--->start--->resume
情景七:看一下activity彈出dialog時生命週期是怎麼呼叫的吧!!!想到的情況有限,可能會一直補充的
稍候加,想整合個dialog去測試
測試結果空空如也( ⊙ o ⊙ )!
發現dialog在依賴activity顯示和消失的過程中不呼叫任何生命週期方法
情景八:橫豎屏切換
1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法(據說用模擬器是這個結果)
但我用OPPO7 真機測試發現上述三種情況都掉用了一次生命週期,且螢幕切換的時候原有的activity是被銷燬了的,而重新建立了一個,就想不銷燬之前的activity,然後找到 了這個http://blog.csdn.net/javensun/article/details/6793552 ,我沒有時間去測試,等測試了在附上結果
除去上述生命週期以外,還有幾個方法onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState方法
onWindowFocusChanged() 在 Activity視窗獲得或失去焦點時被呼叫,在onResume之後或onPause之後呼叫
例如建立時首次呈現在使用者面前;當前Activity被其他Activity覆蓋;當前Activity轉到其他Activity或按Home鍵回到主屏,自身退居後臺;使用者退出當前Activity。以上幾種情況都會呼叫onWindowFocusChanged,並且當Activity被建立時是在onResume之後被呼叫,當Activity被覆蓋或者退居後臺或者當前Activity退出時,它是在onPause之後被呼叫
onSaveInstanceState() Activity被系統殺死時被呼叫.例如:螢幕方向改變時,Activity被銷燬再重建;當前Activity處於後臺,系統資源緊張將其殺死. 另外,當跳轉到其他Activity或者按Home鍵回到主屏時該方法也會被呼叫,系統是為了儲存當前View元件的狀態.在onStop()之前被呼叫
onRestoreInstanceState()
Activity被系統殺死後再重建時被呼叫.例如:螢幕方向改變時,Activity被銷燬再重建;當前Activity處於後臺,系統資源緊張將其殺死,使用者又啟動該Activity.這兩種情況下onRestoreInstanceState都會被呼叫,在onStart之後.