Android生命週期(Lifecycle)

  1. Android生命週期(Lifecycle)
  2. 因Activity摧毀,將參數恢復
  3. Activity之間導航

1. Android生命週期(Lifecycle)

此圖參考Android官網

onCreate()

在此階段還"未創建",相關聯組件會收到ON_CREATE事件,完成之後,會進入"已開始"狀態

onStart()

此階段進入"已開始",相關聯組件會收到ON_START事件,做進入前台的準備,通常用來做"初始化"維護介面,此回調時間非常短,結束會呼叫onResume

onResume()

此階段進入"已恢復",相關聯組件會收到ON_RESUME事件,來到前台,可執行可見的於前台需要的任何功能,如相機預覽畫面

發生中斷會呼叫onPause(),返回則再次回調

onPause()

此階段進入"已暫停",相關聯組件會收到ON_PAUSE事件,用戶離開Activity的第一個旗標,但不代表摧毀Activity

不應在此階段保存應用或用戶資訊,此階段操作因以簡單為主

高負載關閉操作應在onStop階段執行

onStop()

此階段進入"已停止",相關聯組件會收到ON_STOP事件,此時不可見

暫停動畫、粗略位置更新、資源釋放、保存資料,皆在此執行

此階段完成後,要馬返回互動onRestart(),要馬結束Activity onDestroy

onDestroy()

摧毀Activity前,會先執行此,相關聯組件會收到ON_DESTROY事件,調用此的原因有兩個

  1. Activity即將結束
  2. 配置變更(如設備翻轉、多視窗模式),暫時摧毀Activity

可以使用isFinishing()來區分上面兩種狀況

在此要釋放在onStop未釋放的所有資源

onRestoreInstanceState

This method is called between onStart() and onPostCreate(Bundle). This method is called only when recreating an activity; the method isn’t invoked if onStart() is called for any other reason.

以上來自Android官網

重建Activity時,在onStart()與onPostCreate(Bundle)之間

onCreate -> onStart -> onRestoreInstanceState -> onPostCreate(一般不去實現,參考這裡)

因此恢復資料可以選擇在onCreate或onRestoreInstanceState其中一個做恢復

onSaveInstanceState

If called, this method will occur after onStop() for applications targeting platforms starting with Build.VERSION_CODES.P. For applications targeting earlier platform versions this method will occur before onStop() and there are no guarantees about whether it will occur before or after onPause().

以上來自Android官網

以Build.VERSION_CODES.P(28, Android 9.0)為分界

Build.VERSION_CODES.P版本之後(包含此版本)皆發生在onStop之後

Build.VERSION_CODES.P版本之前,發生在onStop之前並不保證,無論它發生在onStop之前還是onPause之後

Lifecycle

上述相關聯組件會收到ON_CREATE事件等等,要如何在Class新增觀察,參考Android 新增Lifecycle觀察

2. 因Activity摧毀,將參數恢復

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    if(savedInstanceState != null) {
        flagState = savedInstanceState.getBoolean(FALSE_BOOLEAN_KEY)
    }
    println("A onCreate")
}

override fun onStart() {
    super.onStart()
    println("A onStart")
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    flagState = savedInstanceState.getBoolean(FALSE_BOOLEAN_KEY)
    println("A onRestoreInstanceState")
}

//Activity可能臨時會被摧毀,在此保存資料
override fun onSaveInstanceState(outState: Bundle) {
    outState.putBoolean(FALSE_BOOLEAN_KEY, flagState)
    super.onSaveInstanceState(outState)
    println("A onSaveInstanceState")
}

3. Activity之間導航

1個Activity啟動另一個Activity

不需返回結果,直接調用startActivity(),以下是呼叫另一個Activity方法

val intent = Intent(this, SignInActivity::class.java)
startActivity(intent)

startActivity()的其他用法,參考Android startActivity其他用法

結束時希望返回結果,以前是調用startActivityForResult() ,此方法已被Google棄用

取得代之的是ActivityResultContract,使用方法參考Android startActivityForResult棄用?

備註:一個Activity啟動,另一個停止,這個過程是同步進行的

也就是一個啟動,另一個並還沒停止,反過來也是如此

以上資訊參考於Android官網


相關文章

Android 新增Lifecycle觀察Android startActivity其他用法
Android startActivityForResult棄用?Android Launch modes使用分析整理

訂閱Codeilin的旅程,若有最新消息會通知。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

透過 WordPress.com 建置的網站.

向上 ↑

%d 位部落客按了讚: