Context

作者: Wi1ls努力努力再努力 | 来源:发表于2019-03-22 11:34 被阅读0次

    Context 表示上下文。
    Android中的 Context 使用了装饰模式。

    image.png

    Android 中 Context 的实现类目前只有唯一的 ContextImpl ,其构造方法是 private 的,但是对外提供了3个 static 用以 createContextImpl

     //如果该进程是 system 进程,则会调用此方法生成 Context
    static ContextImpl createSystemContext(ActivityThread mainThread) {
            LoadedApk packageInfo = new LoadedApk(mainThread);
            ContextImpl context = new ContextImpl(null, mainThread,
                    packageInfo, null, null, false, null, null, Display.INVALID_DISPLAY);
            context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
                    context.mResourcesManager.getDisplayMetricsLocked());
            return context;
        }
        //Application 或者 Service 调用
        static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
            if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
            return new ContextImpl(null, mainThread,
                    packageInfo, null, null, false, null, null, Display.INVALID_DISPLAY);
        }
     //Activity调用
        static ContextImpl createActivityContext(ActivityThread mainThread,
                LoadedApk packageInfo, int displayId, Configuration overrideConfiguration) {
            if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
            return new ContextImpl(null, mainThread, packageInfo, null, null, false,
                    null, overrideConfiguration, displayId);
        }
    

    private ContextImpl(ContextImpl container, ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted, Display display,
    Configuration overrideConfiguration, int createDisplayWithId){
      ...
    }
    

    //对于 Application 中的 Context

    //makeApplication()@LoadedApk
    public Application makeApplication(boolean forceDefaultAppClass, Instrumentation instrumentation){
      ...
      //  这个 Context 就是传到 Application 中的
      ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
      app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);
      ...
    }
    
    static ContextImple createAppContext(ActivityThread mainThread, LoadedApk packageInfo){
      return new Context(null, mainThread,packageInfo, null, null, false, null,null, Display.INVALID_DISPLAY);
    }
    

    所以在 Application 的 Context 中

    • ContextImpl contatiner = null;
    • ActivityThread mainThread = mainThread;
    • LoadedPack packageInfo = packageInfo;
    • IBinder activityToken = null;
    • UserHandle user = null;
    • boolean restricted = flase;
    • Display display = null;
    • Configuration overrideConfiguration = null;
    • int creatDisplayWithId = Display.INVALID_DISPLAY;

    activity中的 context

    //performActivity@ActivityThread
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent){
      ...
      Context appContext = createBaseContextForActivity(r, activity);
      ...
    }
    
    private Context createBaseContextForActivity(ActivityRecord r, final Activity activity){
      
      ContextImpl appContext = ContextImple.createActivityContext(this, r.packageInfo, displayId, r.overrideConfig);
    }
    
    static ContextImpl createActivityContext(ActivityThread mainThread, LoadedApk packageInfo, int displayId, Configuration overrideConfiguration){
      return new ContextImple(null, mainThred, packageInfo, null, null, false, null, overrideConfiguration, displayId);
    }
    
    • ContextImple container = null;
    • ActivityThread mainThread = mainThread;
    • LoadedApk packageInfo = packageInfo;
    • IBinder activityToken = null;
    • UserHandle user = null;
    • boolean restricted = false;
    • Display display = null;
    • OverrideConfiguration overrideConfiguration = overrideConfiguration;
    • int createDisplayWithId = displayId;

    Service的context

    //handleCreateService@ActivityThread
    private void handleCreateService(CreateServiceData data){
      ContextImpl context = ContextImpl.createAppContext(this,packageInfo);
    }
    

    相关文章

      网友评论

          本文标题:Context

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