gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:55 24 4
gpt4 key购买 nike

我有一个 Application 类,我在其中覆盖了 getApplicationContext()

我查看了 Android 源代码,但无法找到它的调用位置?

继承层次是:

应用程序 -> ContextWrapper -> 上下文

public abstract Context getApplicationContext();

getApplicationContext()Context 类中的抽象方法,在 ContextWrapper 类中被重写。

@Override
public Context getApplicationContext() {
return mBase.getApplicationContext();
}

mBase 是对类型 Context 的对象的引用,该对象在 ContextWrapper 的构造函数中初始化,但根据代码,应用程序的类构造函数将 null 传递给 super 的构造函数()ContextWrapper 的构造函数。

public Application() {
super(null);
}

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

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

但也没有调用此方法。请帮助我找到 getApplicationContext() 从哪里调用?

注意:请不要发布此类问题的任何链接,因为我已经逐一解决了这些问题,但仍然没有具体的答案。

最佳答案

我想问题是“attachBaseContext() 在哪里为 Application 对象调用?”

Application.java :

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

如果你在调用链上往上走一点,你会发现 Instrumentation.newApplication() ( Instrumentation.java ) 最后是 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;

简而言之,提供给 Application 类的基础 Context 是一个 ContextImpl 实例,就在这个方法中创建。

并且,如果您检查 ContextImpl.getApplicationContext():

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

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

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

关于android - 什么时候调用Application类的getApplicationContext()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24883903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com