Android學(xué)習(xí)筆記7 Context完全解析

不知不覺犀填,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結(jié)構(gòu)1

Context結(jié)構(gòu)2

可以看到Context類里有很多抽象方法都是我們比較熟悉的,比如獲取資源管理器陷寝,獲取內(nèi)容解析器锅很,activity、broadcast凤跑、service等組件的常用操作爆安,都可以找到。這時饶火,我們再看下Activity類繼承關(guān)系鹏控。

Activity類繼承關(guān)系

還有Service類繼承關(guān)系

Paste_Image.png

這下,我們應(yīng)該清楚了肤寝,Service和Activity類以及Application類都是Context類的子類当辐,下面這張圖很直觀。

Context類結(jié)構(gòu)

三鲤看、Context深入

與Context有關(guān)的幾個類主要如下缘揪。

  1. 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的地方還是比較多的坎藐,下面是些主要的場景为牍。


Context不同的使用場景.png
  1. ContentProvider、BroadcastReceiver之所以在上述表格中岩馍,是因為在其內(nèi)部方法中都有一個context用于使用碉咆。
  1. 可以看到有一些NO上添加了一些數(shù)字,其實這些從能力上來說是YES兼雄,但是為什么說是NO呢吟逝?解釋如下。
  2. 數(shù)字1:啟動Activity在這些類中是可以的赦肋,但是需要創(chuàng)建一個新的task块攒。一般情況不推薦。
  3. 數(shù)字2:在這些類中去layout inflate是合法的佃乘,但是會使用系統(tǒng)默認(rèn)的主題樣式囱井,如果你自定義了某些樣式可能不會被使用。
  4. 數(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)存泄漏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惜论,一起剝皮案震驚了整個濱河市许赃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馆类,老刑警劉巖混聊,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乾巧,居然都是意外死亡句喜,警方通過查閱死者的電腦和手機僵闯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藤滥,“玉大人,你說我怎么就攤上這事社裆∽景恚” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵泳秀,是天一觀的道長标沪。 經(jīng)常有香客問我,道長嗜傅,這世上最難降的妖魔是什么金句? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吕嘀,結(jié)果婚禮上违寞,老公的妹妹穿的比我還像新娘。我一直安慰自己偶房,他們只是感情好趁曼,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棕洋,像睡著了一般挡闰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掰盘,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天摄悯,我揣著相機與錄音,去河邊找鬼愧捕。 笑死奢驯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晃财。 我是一名探鬼主播叨橱,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼断盛!你這毒婦竟也來了罗洗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤钢猛,失蹤者是張志新(化名)和其女友劉穎伙菜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體命迈,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贩绕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年火的,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淑倾。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡馏鹤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娇哆,到底是詐尸還是另有隱情湃累,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布碍讨,位于F島的核電站治力,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勃黍。R本人自食惡果不足惜宵统,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望覆获。 院中可真熱鬧马澈,春花似錦、人聲如沸弄息。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疑枯。三九已至辩块,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荆永,已是汗流浹背废亭。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留具钥,地道東北人豆村。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像骂删,于是被迫代替她去往敵國和親掌动。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容