不知不覺犀填,Android學(xué)習(xí)筆記已經(jīng)寫到了第7篇,這篇主要是介紹Context超升,上下文入宦,因為之前經(jīng)常會碰到它,但是對它并不是十分了解室琢,所以最近參考了一些網(wǎng)上的資料乾闰,加上自己的一些整理,簡單地對它進行了一點學(xué)習(xí)總結(jié)盈滴。
一涯肩、Context概述
二、Context初探
三巢钓、Context深入
四病苗、Context總結(jié)
記得之前做過一個簡單的Demo,我把幾個用到的資源文件放在assets目錄下竿报,之后我準(zhǔn)備寫個util工具類專門負(fù)責(zé)讀取這些文件,然后想在其中通過getAssets獲取Assets資源管理器继谚,但是始終有問題烈菌,后來百度的時候找到答案阵幸,在util工具類要有個Context實例,必須通過它來獲取AssetManager芽世。
一挚赊、Context概述
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.
Context,上下文济瓢,用戶與操作系統(tǒng)操作的一個過程荠割,這個對象描述的是一個應(yīng)用程序環(huán)境的全局信息。它是一個Android系統(tǒng)提供具體實現(xiàn)的抽象類旺矾,可以讓我們訪問應(yīng)用具體的資源和類文件蔑鹦,包括一些應(yīng)用級別的操作,例如啟動Activity箕宙,廣播嚎朽,以及接收意圖等等。
二柬帕、Context初探
我們可以先大致看下Context類里面的結(jié)構(gòu)哟忍。
可以看到Context類里有很多抽象方法都是我們比較熟悉的,比如獲取資源管理器陷寝,獲取內(nèi)容解析器锅很,activity、broadcast凤跑、service等組件的常用操作爆安,都可以找到。這時饶火,我們再看下Activity類繼承關(guān)系鹏控。
還有Service類繼承關(guān)系
這下,我們應(yīng)該清楚了肤寝,Service和Activity類以及Application類都是Context類的子類当辐,下面這張圖很直觀。
三鲤看、Context深入
與Context有關(guān)的幾個類主要如下缘揪。
- ContextWrapper
Context的直接子類,wrapper意為包裝义桂,這個類主要是代理實現(xiàn)Context類里的所有操作找筝,可以看到其內(nèi)部有個Context實例mBase。
public class ContextWrapper extends Context {
Context mBase;
public ContextWrapper(Context base) {
mBase = base;
}
/**
* 創(chuàng)建Application慷吊、Service袖裕、Activity,會調(diào)用該方法給mBase屬性賦值
* @param base The new base context for this wrapper.
*/
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
...
}
2.ContextThemeWrapper
繼承了ContextWrapper的子類溉瓶,可以允許我們修改包裝的context里的主題急鳄。我們可以看到Activity是繼承這個類的谤民,而Service沒有繼承這個類,因為Service不需要主題疾宏。
public class ContextThemeWrapper extends ContextWrapper {
private int mThemeResource;
private Resources.Theme mTheme;
private LayoutInflater mInflater;
private Configuration mOverrideConfiguration;
private Resources mResources;
public ContextThemeWrapper() {
super(null);
}
public ContextThemeWrapper(Context base, @StyleRes int themeResId) {
super(base);
mThemeResource = themeResId;
}
public ContextThemeWrapper(Context base, Resources.Theme theme) {
super(base);
mTheme = theme;
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
}
...
}
四张足、Context總結(jié)
在平常的開發(fā)中,我們使用Context的地方還是比較多的坎藐,下面是些主要的場景为牍。
- ContentProvider、BroadcastReceiver之所以在上述表格中岩馍,是因為在其內(nèi)部方法中都有一個context用于使用碉咆。
- 可以看到有一些NO上添加了一些數(shù)字,其實這些從能力上來說是YES兼雄,但是為什么說是NO呢吟逝?解釋如下。
- 數(shù)字1:啟動Activity在這些類中是可以的赦肋,但是需要創(chuàng)建一個新的task块攒。一般情況不推薦。
- 數(shù)字2:在這些類中去layout inflate是合法的佃乘,但是會使用系統(tǒng)默認(rèn)的主題樣式囱井,如果你自定義了某些樣式可能不會被使用。
- 數(shù)字3:在receiver為null時允許趣避,在4.2或以上的版本中庞呕,用于獲取黏性廣播的當(dāng)前值。(可以無視)
最后程帕,關(guān)于Context的使用有一個注意的地方就是住练,和UI相關(guān)的方法基本都不建議或者不可使用Application,應(yīng)該使用Activity作為Context來處理愁拭;其他的一些操作讲逛,Service,Activity,Application等實例都可以,同時岭埠,使用中一定要注意Context引用的持有盏混,防止內(nèi)存泄漏。