什么时候调用Application类的getApplicationContext()?

Cod*_*ior 10 android android-context

我有一个Application课我在其中覆盖getApplicationContext().

我查看了Android源代码,我无法找到它所在的位置?

继承层次结构是:

Application -> ContextWrapper -> Context

public abstract Context getApplicationContext();
Run Code Online (Sandbox Code Playgroud)

getApplicationContext()Context类中的一个抽象方法,它在类中被重写ContextWrapper.

@Override
public Context getApplicationContext() {
    return mBase.getApplicationContext();
}
Run Code Online (Sandbox Code Playgroud)

mBaseContext在ContextWrapper的构造函数中初始化的类型的对象的引用,但是根据代码,Application的类构造函数将null传递给super()ie的构造函数的构造函数ContextWrapper.

public Application() {
    super(null);
}
Run Code Online (Sandbox Code Playgroud)

现在传递上下文的唯一可能方法是:

protected void attachBaseContext(Context base) {
    if (mBase != null) {
        throw new IllegalStateException("Base context already set");
    }
    mBase = base;
}
Run Code Online (Sandbox Code Playgroud)

但也没有对这种方法的要求.请帮助我找到那个getApplicationContext()叫做的地方吗?

注意:请不要发布任何链接到这些问题,因为我已经完成了每个问题,但仍然没有具体的答案.

mat*_*ash 20

我想问的问题是" 对象的attachBaseContext()调用位置是Application什么?"

请参阅Application.java:

/**
 * @hide
 */
/* package */ final void attach(Context context) {
    attachBaseContext(context);
    mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}
Run Code Online (Sandbox Code Playgroud)

如果你进一步向上调用链,你会发现Instrumentation.newApplication()(Instrumentation.java)和finally LoadedApk.makeApplication()(LoadedApk.java),它们在应用程序启动时被调用:

    java.lang.ClassLoader cl = getClassLoader();
    ContextImpl appContext = new ContextImpl();
    appContext.init(this, null, mActivityThread);
    app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);
    ...
    mApplication = app;
Run Code Online (Sandbox Code Playgroud)

简而言之,提供给Application类的基本Context 是ContextImpl在此方法中创建的实例.

而且,如果你检查ContextImpl.getApplicationContext():

@Override
public Context getApplicationContext() {
    return (mPackageInfo != null) ? mPackageInfo.getApplication() : mMainThread.getApplication();
}
Run Code Online (Sandbox Code Playgroud)

你会看到它实际上最终调用LoadedApk.getApplication()(因为mPackageInfoLoadedApk实例),这是mApplicationmakeApplication()前面提到的方法设置的字段.

简而言之,在完成所有这些设置之后,Application.getApplicationContext()最终返回......同样的Application实例.:)

  • @AndroidWarrior如有疑问,请务必检查 https://android.googlesource.com/platform/frameworks/base.git/+/master (或更一般地说,https://android.googlesource.com/),这是官方 AOSP存储库。github 和 grepcode 都是镜像,并不总是完全同步。 (2认同)