2019年11月27日 星期三

實務 Android 第一課 - Activity 生命週期與創立 AppCompatActivity



Application 類可以代表整個應用程式的類別,或是說成是整個 App 的全局類別,可用於讀寫 App 的一些環境配置和屬性訊息,亦可用於當所有 Activity 都需要使用的物件時,將該物件建立於 onCreate() 中,可在任何一個 Activity 中所使用。Application 類通常較少使用,本系列課程屬於實務類型,就不多做介紹,課程重點將放在 Activity 上。

Main lifetime :

Entire lifetime:整個 Activity 從 onCreate() 開始到 onDestroy() 結束。

Visible lifetime:在 onStart() 與 onStop() 之間,User 在螢幕上可看見的。

Foreground lifetime:在 onResume() 到 onPause() 之間,可直接跟 User 進行人機互動,故此時期指的即是上圖的 Activity is running。


Activity 常見的動作流程:

啟動 Activity:
onCreate -> onStart -> onResume
啟動 Activity 時,先創造與分配資源 (onCreate),將內容顯示到螢幕上 (onStart),取得螢幕的控制權 (onResume),User 可以開始使用這個程式。

呼叫另一個 Activity:
onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1)
先暫停 Activity 1 (onPause),直到 Activity 2 完成一般啟動流程後,,Activity 1 才會被停止 (onStop)。

回復原 Activity:
onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestroy(2)
按 Back 鍵可以回到原本的 Activity。

退出 / 結束 Activity:
onPause -> onStop -> onDestroy
在程式中可呼叫 finish() 函式來關閉 Activity,系統會暫停 (onPause),停止 (onStop) 然後銷毀 (onDestroy)。


創立 AppCompatActivity 之 Kotlin 程式碼:

open class MainActivity : AppCompatActivity() {

val TAG = "Main"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.i(TAG,"onCreate():創建 Activity")
    }

    override fun onStart() {
        super.onStart()
        Log.i(TAG,"onStart():開啟")
    }

    override fun onRestart() {
        super.onRestart()
        Log.i(TAG,"onRestart():重新開啟")
    }

    override fun onResume() {
        super.onResume()
        Log.i(TAG,"onResume():獲得焦點")
    }

    override fun onStop() {
        Log.i(TAG,"onStop():停止")
        super.onStop()
    }

    override fun onPause() {
        Log.i(TAG,"onPause():暂停")
        super.onPause()
    }

    override fun onDestroy() {
        Log.i(TAG,"onDestroy():銷毀")
        super.onDestroy()
    }

    override fun finish() {
        Log.i(TAG,"finish():結束")
        super.finish()
    }

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        Log.i(TAG,"onAttachedToWindow():添加到界面")
    }

    override fun onDetachedFromWindow() {
        Log.i(TAG,"onDetachedFromWindow():從界面移除")
        super.onDetachedFromWindow()
    }

    override fun onTrimMemory(level: Int) {
        Log.i(TAG,"onTrimMemory(level: Int):手機內存不足回調")
        super.onTrimMemory(level)
    }