Context(一)--基础

235 阅读2分钟

「这是我参与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各种权限管理