Android任意位置獲取應(yīng)用Context

在編寫(xiě)某些自定義類時(shí),無(wú)法方便的取得Context(Activity或Application),例如需要獲取res資源,取些drawable或string之類的,通常會(huì)比較麻煩。

解決方法一般有:
1、傳入Context(例如Toast)
2、繼承Application使用單例(此法在編寫(xiě)應(yīng)用無(wú)關(guān)的工具類時(shí)無(wú)法很好的解決問(wèn)題)

一般來(lái)說(shuō),能使用Activity盡量不用Application作為Context,官方文檔(This generally should only be used if you need a Context whose lifecycle is separate from the current context, that is tied to the lifetime of the process rather than the current component.)
但在獲取資源文件時(shí)通常并無(wú)大礙,因此筆者特別為能夠在任意位置獲取應(yīng)用Context做了一番研究。

在上述方法2中雖有缺陷,但經(jīng)過(guò)一番改造仍不失為一個(gè)不錯(cuò)的解決方法。
首先我們構(gòu)造一個(gè)存儲(chǔ)Context的類ContextHolder,在Application初始化時(shí)將Application傳入ContextHolder,這個(gè)方法在很多第三方庫(kù)都能見(jiàn)到類似的處理。

public class ContextHolder {
  static Context ApplicationContext;
  public static void initial(Context context) {
    ApplicationContext = context;
  }
  public static Context getContext() {
    return ApplicationContext;
  }
}

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ContextHolder.initial(this);
    }
}

這樣我們就能在任意位置調(diào)用ContextHolder.getContext()來(lái)獲取應(yīng)用Context。

那么有沒(méi)有可能不需要任何初始化操作就能完成這個(gè)需求呢?筆者做了一些嘗試。
由于實(shí)際上獲取應(yīng)用Context也就是獲取當(dāng)前應(yīng)用實(shí)例,經(jīng)筆者研究下面2種方法都可以通過(guò)反射直接獲取當(dāng)前應(yīng)用。

try {    
  Application application = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null, (Object[]) null);    
}
catch (Exception e) {    
  e.printStackTrace();
}

try {    
  Application application = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null, (Object[]) null);    
}
catch (Exception e) {    
  e.printStackTrace();
}

經(jīng)測(cè)試,即使應(yīng)用處于后臺(tái)仍能正確獲取到調(diào)用此方法的Application。

筆者以此開(kāi)發(fā)的工具:
AndroidContextHolder

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • Android插件化基礎(chǔ)的主要內(nèi)容包括 Android插件化基礎(chǔ)1-----加載SD上APKAndroid插件化基...
    隔壁老李頭閱讀 4,751評(píng)論 2 35
  • 一,我認(rèn)為電商改變了供給的方式和數(shù)量,增加了需求量,讓供給從傳統(tǒng)的單一的線下銷售與運(yùn)營(yíng)變?yōu)榫€上與線下必行,增加了有...
    3edd52f615c0閱讀 276評(píng)論 1 1
  • 今天我跟同事顧老師聊天:她從去年開(kāi)始堅(jiān)持早泳,每天都是5點(diǎn)半起床,吃完早餐后一路走到游泳館,游完一千米后再走路上班...
    小賢哥2017閱讀 1,938評(píng)論 2 12

友情鏈接更多精彩內(nèi)容