「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」
当我们加载资源,启动新Activity,获取系统资源等都需要Context,每个开发人员都会用Context,但是并不是每一个开发者都真正懂Context原理,那我们从下面几个方面研究一下Context
- Context 是什么
- Context初始化流程
- 不同应用组件之间Context区别
Context是什么
Context被翻译成‘上下文’,我们可以理解为当前对象在程序中所处的一个环境,代表与操作系统交互的过程 我们看看Context的源码
public abstract class Context {
...
public abstract AssetManager getAssets();
public abstract Resources getResources();
public abstract PackageManager getPackageManager();
public abstract ContentResolver getContentResolver();
public abstract Looper getMainLooper();
}
public final CharSequence getText(int resId) {
throw new RuntimeException("Stub!");
}
@NonNull
public final String getString(int resId) {
throw new RuntimeException("Stub!");
}
@NonNull
public final String getString(int resId, Object... formatArgs) {
throw new RuntimeException("Stub!");
}
public final int getColor(int id) {
throw new RuntimeException("Stub!");
}
@Nullable
public final Drawable getDrawable(int id) {
throw new RuntimeException("Stub!");
}
Context是一个抽象类,里面定义了很多抽象方法。ContextWrapper和ContextImpl是Context的代理,Context中的抽象方法真正的实现在子类中
- Context有两个实现子类:ContextWrapper和ContextImpl。
- ContextWrapper:是Context的代理实现类,包含一个Context类型的成员变量mBase,提供的代理方法都是通过mBase实现的。mBase 通过构造方法或者调用attachBaseContext(Context base)赋值,调用ContextWrapper的方法都会被转向其所包含的真正的Context对象
- ContextImpl:真正实现Context的所有函数,应用程序中所调用的各种Context类的方法
- Application,Service继承ContextWrapper,Activity继承ContextWrapper的子类ContextThemeWrapper,但它们初始化的过程中都会创建ContextImpl对象
程序在什么情况下会Context
- 创建Application对象时,整个App共一个Application对象
- 创建Activity对象
- 创建Service对象 所以Context的对象个数为:Application+Activity个数+Service个数
Context主要功能
- 启动Activity
- 访问Apk中各种资源(Resources/AssetManager等)
- 访问Package相关信息
- 启动/停止Service
- 发送/注册 Intent
- Apk各种权限管理