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

 纪志鹏大利集客_776 发布于 2023-01-01 18:10

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

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

继承层次结构是:

Application -> ContextWrapper -> Context

public abstract Context getApplicationContext();

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

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

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

public Application() {
    super(null);
}

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

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

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

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

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

    请参阅Application.java:

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

    如果你进一步向上调用链,你会发现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;
    

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

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

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

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

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

    2023-01-01 18:12 回答
  • ContextsetBaseContext当第一次创建Activity/Service/Receiver实例时,通过方法设置.这是调用堆栈:

    ContextWrapper :: attachBaseContext < - Application :: attach < - Instrumentation :: newApplication < - LoadedApk :: makeApplication < - ActivityThread :: performLaunchActivity || ActivityThread :: handleReceiver || ActivityThread :: handleCreateService || ActivityThread :: handleBindApplication

    2023-01-01 18:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有