美文网首页
Context 的创建过程

Context 的创建过程

作者: that_is_this | 来源:发表于2018-05-07 15:55 被阅读15次

总共可分为 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);

相关文章

网友评论

      本文标题:Context 的创建过程

      本文链接:https://www.haomeiwen.com/subject/lvqvrftx.html