android Context詳解

Google官方解釋:
/**
 * Interface to global information about an application environment.  This is
 * an abstract class whose implementation is provided by
 * the Android system.  It
 * allows access to application-specific resources and classes, as well as
 * up-calls for application-level operations such as launching activities,
 * broadcasting and receiving intents, etc.
 */
 翻譯爲:
 /**
 *接口有關的應用程序環境的全局信息。這是
 *一個抽象類,它的實現是通過提供
 * Android系統。它
 *允許訪問特定應用程序的資源和類,以及
 *向上調用應用程序級別的操作,例如啓動活動,
 *廣播和接收意向等。
 */

Context是一個抽象基類,我們通過它訪問當前包的資源(getResources、getAssets)和啓動其他組件(Activity、Service、Broadcast)
以及得到各種服務(getSystemService),當然,通過Context能得到的不僅僅只有上述這些內容。對Context的理解可以來說:Context提供了一個應用的運行環境
,在Context的大環境裏,應用纔可以訪問資源,才能完成和其他組件、服務的交互,Context定義了一套基本的功能接口,我們可以理解爲一套規範,
而Activity和Service是實現這套規範的子類,這麼說也許並不準確,因爲這套規範實際是被ContextImpl類統一實現的,
Activity和Service只是繼承並有選擇性地重寫了某些規範的實現。

Application、Activity和Service作爲Context的區別
首先,它們都間接繼承了Context,這是它們的相同點。
通過對比可以清晰地發現,Service和Application的類繼承關係比較像,而Activity還多了一層繼承ContextThemeWrapper,
這是因爲Activity有主題的概念,而Service是沒有界面的服務,Application更是一個抽象的東西,它也是通過Activity類呈現的。


Context對資源的訪問

很明確,不同的Context得到的都是同一份資源。這是很好理解的,請看下面的分析

得到資源的方式爲context.getResources,而真正的實現位於ContextImpl中的getResources方法,在ContextImpl中有一個成員 private Resources mResources,它就是getResources方法返回的結果,mResources的賦值代碼爲:

mResources = mResourcesManager.getTopLevelResources(mPackageInfo.getResDir(),
 Display.DEFAULT_DISPLAY, null, compatInfo, activityToken);

下面看一下ResourcesManager的getTopLevelResources方法,這個方法的思想是這樣的:在ResourcesManager中,所有的資源對象都被存儲在ArrayMap中,首先根據當前的請求參數去查找資源,如果找到了就返回,否則就創建一個資源對象放到ArrayMap中。有一點需要說明的是爲什麼會有多個資源對象,原因很簡單,因爲res下可能存在多個適配不同設備、不同分辨率、不同系統版本的目錄,按照android系統的設計,不同設備在訪問同一個應用的時候訪問的資源可以不同,比如drawable-hdpi和drawable-xhdpi就是典型的例子。

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章