最直接觀察這些生命週期階段的方式,就是去覆寫這些回調方法。
onCreate()
onStart()
、onRestart()
onResume()
onPause()
onStop()
onDestroy()
當 Activity 被建立時只會調用一次。此時 Activity 尚未可見(visible)。
在onCreate()
,你會執行重要、一次性的初始化,像是膨脹佈局(inflating the layout)。
請參考以下官方 Codelab 示例:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Timber.i("onCreate Called")
// Use Data Binding to get reference to the views
// 使用資料綁定(Data Binding)來得到對視圖(views)的引用
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.dessertButton.setOnClickListener {
onDessertClicked()
}
// Setup dessertTimer, passing in the lifecycle
// 設置 dessertTimer,將 Activity 的生命週期傳遞進 DessertTimer class
dessertTimer = DessertTimer(this.lifecycle)
// If there is a savedInstanceState bundle,
// then you're "restarting" the activity
// 如果有 savedInstanceState bundle 的存在
// (可以理解成暫存 Activity 的一捆進度)
// 則重新開始(restarting) Activity
// If there isn't a bundle, then it's a "fresh" start
// 如果這個暫存進度不存在,則全新開始一個 Activity
if (savedInstanceState != null) {
// Get all the game state information from the bundle, set it
// 從暫存進度獲取全部的遊戲狀態資訊,並設置這些資訊
revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
dessertTimer.secondsCount
= savedInstanceState.getInt(KEY_TIMER_SECONDS, 0)
showCurrentDessert()
}
// Set the TextViews to the right values
// 將正確數值設置到 TextViews
binding.revenue = revenue
binding.amountSold = dessertsSold
// Make sure the correct dessert is showing
// 確保顯示正確的甜點圖片
binding.dessertButton.setImageResource(currentDessert.imageId)
}
參考資料
Dessert Pusher (Udacity - Free Courses - Example Code)