技術學習記錄

[Android]Application元件

Application類別

什麼是Application?

Application和Activity、Service一樣,是Android框架中的一個系統組件。

當APP啟動時,系統會自動建立一個Application對象,用來儲存系統的一些資訊。

Android會在APP執行時,替每個APP建立一個Application類別的對象,這個對象只會存在一個實例,也就是說Application是單例模式的一個物件。

一般來說我們是不需要自行指定一個Application物件的。但如果某些情境需要在Application中進行初始化,那就需要自己建立一個客製化的Application物件,如下面Realm資料庫的初始化情形:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        // 初始化 Realm 資料庫
        Realm.init(this)
        val config = RealmConfiguration.Builder()
            .name("my.database.db")
            .build()
        Realm.setDefaultConfiguration(config)
    }
}

除了上面使用Realm資料庫,需要在Application中初始化等這類的情境之外。還有個更常見的情境。

我們很多時候會需要Contenxt,但在Activity、Service之外是沒有Context可以使用的。

如果直接將Activity的context傳遞到需要呼叫的地方,可能會因為程式碼耦合度太高、又或者是Activity已經被釋放了,但呼叫Activity的context的物件還存在著,而造成記憶體洩漏等問題發生。

因此我們可以透過自訂一個Application物件,讓需要呼叫context的物件直接使用Application的context,如下:

// 自訂 Application
class MyApplication : Application() {

    init {
        instance = this
    }

    companion object {
        private lateinit var instance: MyApplication

        fun getAppContext(): Context {
            return instance
        }
    }
}

// 使用方式
val text = MyApplication.getAppContext().getString(R.string.text_msg_hello)

最後補充說明:由於Android會在APP啟動時建立一個Application物件,因此這個Application物件的生命週期等於是整個APP的生命週期。

也因為APP在執行時,Application只會存在一個實例,因此才可以被當成傳遞全域變數、讓其他物件使用他的context等用途。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *