Carson帶你學(xué)Android:如何理解 Context 對(duì)于Activity的意義蝉娜?

通過這篇文章你將學(xué)習(xí)到:

  • Context 與 Activity 有什么關(guān)系缔莲?
  • Context對(duì)于Activity有什么作用哥纫?
  • 不同類型的Context的應(yīng)用場(chǎng)景是什么?
  • 關(guān)于Context的幾個(gè)常見關(guān)鍵知識(shí)點(diǎn)

1. 二者有什么關(guān)系痴奏?

Context 是一個(gè)抽象類蛀骇;Activity 繼承了 Context厌秒。具體繼承關(guān)系如下:

  • Context的直接實(shí)現(xiàn)子類:ContextImp、ContextWrapper
  • ContextWrapper的子類是常用的Activity松靡、Service简僧、Application



2. Context 對(duì)于Activity有什么作用

Activity 通過 Context接口 去訪問Android系統(tǒng)的服務(wù) & 資源,主要包括:

  1. 獲取應(yīng)用相關(guān)信息
  2. 獲取系統(tǒng)/應(yīng)用資源
  3. 四大組件之間的交互
  4. 文件相關(guān)
  5. 數(shù)據(jù)庫(kù)相關(guān)

具體如下:

public abstract class Context {
    
    // 作用1:獲取應(yīng)用相關(guān)信息
    public abstract ApplicationInfo getApplicationInfo();
    public abstract String getPackageName();
    public abstract Looper getMainLooper();
    public abstract int checkPermission(@NonNull String permission, int pid, int uid);

    // 作用2:獲取系統(tǒng)/應(yīng)用資源
    // 如 AssetManager雕欺、PackageManager岛马、Resources、System Service 以及 color屠列、string啦逆、drawable 等
    public abstract AssetManager getAssets();
    public abstract Resources getResources();
    public abstract PackageManager getPackageManager();
    public abstract Context getApplicationContext();
    public abstract ClassLoader getClassLoader();
    public final @Nullable <T> T getSystemService(@NonNull Class<T> serviceClass) { ... }

    public final String getString(@StringRes int resId) { ... }
    public final int getColor(@ColorRes int id) { ... }
    public final Drawable getDrawable(@DrawableRes int id) { ... }
    public abstract Resources.Theme getTheme();
    public abstract void setTheme(@StyleRes int resid);
    public final TypedArray obtainStyledAttributes(@StyleableRes int[] attrs) { ... }

    // 作用3:四大組件之間的交互
    // 如啟動(dòng) Activity、Broadcast笛洛、Service夏志,獲取 ContentResolver 等
    public abstract void startActivity(@RequiresPermission Intent intent);
    public abstract void sendBroadcast(@RequiresPermission Intent intent);
    public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
                                            IntentFilter filter);
    public abstract void unregisterReceiver(BroadcastReceiver receiver);
    public abstract ComponentName startService(Intent service);
    public abstract boolean stopService(Intent service);
    public abstract boolean bindService(@RequiresPermission Intent service,
            @NonNull ServiceConnection conn, @BindServiceFlags int flags);
    public abstract void unbindService(@NonNull ServiceConnection conn);
    public abstract ContentResolver getContentResolver();
    
    // 作用4:文件相關(guān)
    // 如:獲取緩存文件夾、刪除文件苛让、SharedPreference 相關(guān)等
    public abstract File getSharedPreferencesPath(String name);
    public abstract File getDataDir();
    public abstract boolean deleteFile(String name);
    public abstract File getExternalFilesDir(@Nullable String type);
    public abstract File getCacheDir();
    ...
    public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
    public abstract boolean deleteSharedPreferences(String name);

    // 作用5:數(shù)據(jù)庫(kù)
    // 如打開數(shù)據(jù)庫(kù)沟蔑、刪除數(shù)據(jù)庫(kù)、獲取數(shù)據(jù)庫(kù)路徑等
    public abstract SQLiteDatabase openOrCreateDatabase(...);
    public abstract boolean deleteDatabase(String name);
    public abstract File getDatabasePath(String name);
   
    ...
}

3. 不同類型的Context的應(yīng)用場(chǎng)景是什么狱杰?

從上面可知瘦材,最終的Context類型主要包括:Activity、Service & Application仿畸,那么使用這三者的應(yīng)用場(chǎng)景區(qū)別是什么呢

case1:與UI相關(guān)的場(chǎng)景食棕,都使用Activity類型Context

因?yàn)槭轻槍?duì)當(dāng)前UI界面資源進(jìn)行操作 & 繼承自ContextThemeWrapper(可自定義主題樣式),如show a dialog错沽、 Layout Inflation等簿晓。

case2:生命周期較長(zhǎng)的對(duì)象,都使用Application類型Context

因?yàn)锳pplication Context的生命周期與應(yīng)用保持一致千埃,可避免出現(xiàn)Context引用的內(nèi)存泄漏

其余場(chǎng)景憔儿,三種類型 基本可視為共用。

4. 關(guān)于Context的幾個(gè)常見關(guān)鍵知識(shí)點(diǎn)

4.1 為什么Activity通過ContextThemeWrapper間接繼承ContextWrapper镰禾,而Service跟Application直接繼承ContextWrapper呢皿曲?

答:ContextThemeWrapper類包含了與主題Theme相關(guān)的接口,而只有Activity才需要主題吴侦,Service跟Application不需要屋休。以下是ContextThemeWrapper的源碼

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;
    }
    
   // 包含了大量跟主題相關(guān)的接口方法
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
    }

    public void applyOverrideConfiguration(Configuration overrideConfiguration) {...}

    public Configuration getOverrideConfiguration() {...}

    @Override
    public AssetManager getAssets() {...}

    @Override
    public Resources getResources() {...}

    private Resources getResourcesInternal() {...}

    @Override
    public void setTheme(int resid) {...}

    @Override
    public int getThemeResId() {...}

    @Override
    public Resources.Theme getTheme() {...}

    @Override
    public Object getSystemService(String name) {...}

    protected void onApplyThemeResource(Resources.Theme theme, int resId, boolean first) {

    private void initializeTheme() {...}
}

4.2 getApplication() 與 getApplicationContext()有什么區(qū)別?

返回的是同一個(gè)Applicatoin對(duì)象备韧,但作用域不同:

  • getApplicatoin()的作用域:Activity劫樟、Service,但不能在BroadcastReceiver里使用;
  • getApplicationContext()的作用域會(huì)廣一些叠艳,如包括BroadcastReceiver等奶陈。

4.3 getApplicationContext()、getBaseContext()和Activity.this的區(qū)別是什么附较?

  • getApplicationContext():返回的是Application類型的Context
  • Activity.this:返回的是當(dāng)前Activity的Context
  • getBaseContext():返回構(gòu)造函數(shù)指定的Context / setBaseContext()里傳入的Context

至此吃粒,關(guān)于Context分析完畢。下一篇文章我將對(duì)講解Android 的相關(guān)知識(shí)拒课,感興趣的同學(xué)可以繼續(xù)關(guān)注本人的簡(jiǎn)書哦徐勃。

相關(guān)系列文章閱讀
Carson帶你學(xué)Android:學(xué)習(xí)方法
Carson帶你學(xué)Android:四大組件
Carson帶你學(xué)Android:自定義View
Carson帶你學(xué)Android:異步-多線程
Carson帶你學(xué)Android:性能優(yōu)化
Carson帶你學(xué)Android:動(dòng)畫


歡迎關(guān)注Carson_Ho的簡(jiǎn)書

不定期分享關(guān)于安卓開發(fā)的干貨,追求短早像、平僻肖、快,但卻不缺深度卢鹦。


請(qǐng)點(diǎn)贊臀脏!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冀自,一起剝皮案震驚了整個(gè)濱河市揉稚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熬粗,老刑警劉巖窃植,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荐糜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)葛超,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門暴氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绣张,你說(shuō)我怎么就攤上這事答渔。” “怎么了侥涵?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沼撕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我芜飘,道長(zhǎng)务豺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任嗦明,我火速辦了婚禮笼沥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己奔浅,他們只是感情好馆纳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汹桦,像睡著了一般鲁驶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舞骆,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天钥弯,我揣著相機(jī)與錄音,去河邊找鬼葛作。 笑死寿羞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赂蠢。 我是一名探鬼主播绪穆,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虱岂!你這毒婦竟也來(lái)了玖院?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤第岖,失蹤者是張志新(化名)和其女友劉穎难菌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔑滓,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郊酒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了键袱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燎窘。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹄咖,靈堂內(nèi)的尸體忽然破棺而出褐健,到底是詐尸還是另有隱情,我是刑警寧澤澜汤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布蚜迅,位于F島的核電站,受9級(jí)特大地震影響俊抵,放射性物質(zhì)發(fā)生泄漏谁不。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一徽诲、第九天 我趴在偏房一處隱蔽的房頂上張望拍谐。 院中可真熱鬧烛缔,春花似錦、人聲如沸轩拨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亡蓉。三九已至晕翠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砍濒,已是汗流浹背淋肾。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爸邢,地道東北人樊卓。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杠河,于是被迫代替她去往敵國(guó)和親碌尔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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