Context 的创建过程

总共可分为 Activity context、Application context、ContextImpl(BaseContext) 这些

1. Activity Context

  1. android.app.ActivityThread#performLaunchActivity
  2. android.app.Instrumentation#newActivity 创建Activity实例,直接调用Activity的无参构造
  3. android.app.ActivityThread#createBaseContextForActivity 为Activity创建BaseContext。
  4. android.app.ContextImpl#createActivityContext 创建ContextImpl实例
    设置ContextImpl的OuterContext为Activity
  5. android.app.Activity#attach->android.content.ContextWrapper#attachBaseContext 为Activity的BaseContext赋值;
    因此Activity的BaseContext每次都是新的。

2. Application Context

  1. android.app.LoadedApk#makeApplication,首先判断Application实例是否存在,如果存在则直接返回,不存在继续下面步骤。
  2. 首先调用 android.app.ContextImpl#createAppContext 创建一个ContextImpl实例;
  3. 调用 android.app.Instrumentation#newApplication 创建一个Application实例;
  4. 在调用 newApplication 之前,调用 ContextImpl.createAppContext() 方法生成 ContextImpl
  5. 调用 android.app.Application#attach->android.content.ContextWrapper#attachBaseContext 为Application的BaseContext赋值;
  6. 最后调用 android.app.ContextImpl#setOuterContext 将Application实例赋值给ContextImpl的mOuterContext,这个mOuterContext的作用:
    startActivity时,如果是ActivityContext的话,就不需要加 FLAG_ACTIVITY_NEW_TASK 标记之类的
    创建部分SystemService(如:android.content.Context#NOTIFICATION_SERVICE)时,也会用到mOuterContext。具体参考ContextImpl的static块。
  7. 因为一个进程中只会有 Application的一个实例,因此Application的BaseContext也只会存在一个。

3. 总结

  1. Application 和 Activity 都继承自 ContextWapper,当调用 ContextWapper 内的方法时,就是调用 ContextImpl 内的方法,具体的实现都在这里。
  2. 在调用 getBaseContext() 方法时,这里返回的就是 ContextImpl 对象。
  3. 所以,每一个 Activity / Application 都能转换为 ContextImpl 对象。
  4. Application的BaseContext只会存在一个,而Activity和Service的BaseContext每次都是新的.

4. 其他

  1. 原生 Application 创建新的 Context
    Context mContext = this.getBaseContext().createPackageContext(mPackageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容