美文网首页
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