1. 程式人生 > >複習 activity 的生命週期 手機鎖屏時生命週期變化

複習 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之後.