深入解析Android App开发中Context的用法

2019-12-10 18:57:33于丽
  • 在handleCreateBackupAgent()中
  • 在handleCreateService()中
  • 2次在hanldBinderAppplication()中
  • 在attach()方法中


    由于创建ContextImpl的基本原理类似,所以这里只会分析几个比较有代表性的地方:
    1、  Application对应的Context
    在应用程序启动时,都会创建一个Application对象,所以辗转调用到handleBindApplication()方法。

    private final void handleBindApplication(AppBindData data) { 
        mBoundApplication = data; 
        mConfiguration = new Configuration(data.config); 
     
        .... 
        data.info = getPackageInfoNoCheck(data.appInfo); 
     
          ... 
         
        Application app = data.info.makeApplication(data.restrictedBackupMode, null); 
        mInitialApplication = app; 
     
       .... 
     } 
    
    

    其中data.info是LoadedApk类型的,到getPackageInfoNoCheck中看看源码

    public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai) { 
        return getPackageInfo(ai, null, false, true); 
    } 
    
    

    里面其实调用的是getPackageInfo,继续跟进:

    if (includeCode) { 
            ref = mPackages.get(aInfo.packageName); 
          } else { 
            ref = mResourcePackages.get(aInfo.packageName); 
          } 
          LoadedApk packageInfo = ref != null ? ref.get() : null; 
          if (packageInfo == null || (packageInfo.mResources != null 
              && !packageInfo.mResources.getAssets().isUpToDate())) { 
            if (localLOGV) Slog.v(TAG, (includeCode ? "Loading code package " 
                : "Loading resource-only package ") + aInfo.packageName 
                + " (in " + (mBoundApplication != null 
                    ? mBoundApplication.processName : null) 
                + ")"); 
            packageInfo = 
              new LoadedApk(this, aInfo, this, baseLoader, 
                  securityViolation, includeCode && 
                  (aInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0); 
    if (includeCode) { 
              mPackages.put(aInfo.packageName, 
                  new WeakReference<LoadedApk>(packageInfo)); 
            } else { 
              mResourcePackages.put(aInfo.packageName, 
                  new WeakReference<LoadedApk>(packageInfo)); 
            }