谈谈你对Context的理解

452 阅读2分钟

Context到底是什么?

我们从抽象角度去理解就是上下文,它贯穿整个应用,也可以理解成运行环境,它提供了一个应用运行所需的信息,资源和系统服务等。也可以理解为场景,用户操作和系统交互就是一个场景,启动Activity和服务都少不了context。

从代码的角度去理解,Activity是一个Context,Service是一个Context,Application也是一个Context

Context是一个抽象类,而ContextImpl是Context的实现类,ContextWarpper是Context的包装类,Application和Service继承于ContextWarpper,而Activity继承与ContextThemeWarpper,ContextThemeWarpper是ContextWarpper的子类,负责Activity的主题,资源等设置

所以一个程序应该有Application的Context+多个Activity的Context+多个Service的Context,这句话还不算完整,因为如果有多进程的话,就会有多个Application的Context,这也是一个程序初始化的时候会出现Application的oncreate会执行多次,因为有的sdk需要在新的进程去初始化。

虽然Application、Activity、Service都有内部的Context,他们直接或间接继承于ContextWapper,但是他们的Context都是不同的,具体是因为ContextImpl.createAppContext(xxx,xxx,xxxx)通过不同的参数,比如包信息等创建上下文,然后会通过attach里的attachBaseContext去赋值,最后给了mBase,而mbase就是真正去实现逻辑的管家

Activity里的this和getBaseContext有什么区别?

因为Activity继承ContextThemeWapper->ContextWapper->Context,所以this指的是自己,而getBaseContext里面返回的是mBase,也就是ContextImpl

getAppilicationContext()和getApplication()有什么区别和限制

两者本质上没什么区别,都是返回的Application,但是getApplication的作用域小,只能在Activity和Service上调用比如 (context as Activity).getApplication(),context自己是无法直接调用getApplication的,但是context可以直接调用getAppilicationContext(),最终也是ContextImpl通过LoadApk来获取Application的,

应用组件的构造,oncreate、attachBaseContext调用顺序?

Application: 在应用进程启动的时候会通过ActivityThread的main入口里面会创建ActivityThread,并在onattch里面attachApplication->bindApplication->handleApplicationxxx........

里面会通过类加载器newInstance实例化Application,然后在通过attach方法里面的attachBaseContext将ContextImpl赋值给mBase,然后通过mInstrumentation去调用Application的onCreate方法。

这里我们可知 构造>attachBaseContext>onCreate

Activity、Service和Application类似