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等用途。