天天看點

優雅的擷取Application Context優雅的擷取Application Context

優雅的擷取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

    }
}
           

這裡利用了反射的方式,調用一些隐藏方法,可以有效的解耦,并且不用注入帶來的生命周期問題。