通過這篇文章你將學(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ù) & 資源,主要包括:
- 獲取應(yīng)用相關(guān)信息
- 獲取系統(tǒng)/應(yīng)用資源
- 四大組件之間的交互
- 文件相關(guān)
- 數(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ā)的干貨,追求短早像、平僻肖、快,但卻不缺深度卢鹦。