優雅的擷取Application Context
前言
在android開發中,很多場景我們都會用到Context,比如注冊BroadcastReceiver,擷取系統service,擷取資源等。但是由于Context一般與生命周期關聯,錯誤使用容易造成記憶體洩漏,是以我們一般會選擇使用生命周期最長的Application Context,在其他類中擷取application context的方式有兩種
第一種方式:
在application添加一個context類型的成員變量,通過Application.getContext方法擷取
class MyApplication: Application() {
companion object{
lateinit var mContext: Context
}
override fun onCreate() {
super.onCreate()
mContext=applicationContext
}
}
class TestContext{
fun getAppContext(){
MyApplication.mContext
}
}
第二種方式:
通過傳入context類型的形參,再通過context.getApplicationContext方法擷取application context
fun getAppContextM2(context: Context){
context.applicationContext
}
但是以上兩種方式,也有明顯的缺點,第一種你必須要自己建立一個application,然後編寫靜态方法。第二種,需要注入context,耦合性較高,并且容易造成記憶體洩漏
優化方式
object ContextHelper{
fun getAppContext():Application?{
var app:Application?
try {
app= Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null) as Application
}catch (e:Exception){
app= Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null) as Application
}
return app
}
}
這裡利用了反射的方式,調用一些隐藏方法,可以有效的解耦,并且不用注入帶來的生命周期問題。