理解Context

我们平时对Context的理解无外乎两方面:

  • 调用Context的方法,比如启动activity,访问资源;
  • 作为参数传入context,比如弹出Toast,创建dialog
image.png

ContextImpl实现了context的大部分功能,对应ContextWrapper中的成员变量mBase,这里体现了装饰模式,即ContextWrapper是ContextImpl的包装类,ContextImpl的实现就能根据不同组件的创建方式有所拓展,此外ContextWrapper本身也是可拓展的,如ContextThemeWrapper就包含主题相关方法,适用于作为activity的父类。

这种装饰模式的使用好处在于

  • 对调用者提供统一的context接口,调用者不用关心contextImpl的具体实现
  • ContextImpl的变化能对包装者隐藏。

Context的创建过程
整体而言,Context的子类最终都要绑定一个ContextImpl才能实现真正的context功能。
1、Application Context的创建
在ApplicationTread通知ActivityThread创建application的时候,在ActivityThread的performLaunchActivity中LoadedApk.makeApplication中创建对应的ContextImpl,然后通过Application.attach方法将Application和ContextImpl绑定,ContextImpl会传递成为ContextWrapper中的mBase类。

一个细节在于,application创建后会成被赋值到LoadedApk中的mApplication对象,最终我们getApplication和getApplicationContext其实获取的是同一个对象。

2、Activity Context的创建
创建activity流程中,在ActivityThread的performLaunchActivity中,创建ContextImpl之后创建activity实例,然后通过Activity.attach方法将activity和ContextImpl绑定。
3、Service Context的创建
和Activity的绑定Context过程类似,不过最后是在ActivityThread.handleCreateService方法中完成context的生成和attach工作。

你可能感兴趣的:(理解Context)