繁体   English   中英

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

[英]When is getApplicationContext() of Application class called?

我有一个Application类,其中我重写了getApplicationContext()

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

继承层次结构是:

Application -> ContextWrapper -> Context

public abstract Context getApplicationContext();

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

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

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

public Application() {
    super(null);
}

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

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

但也没有对这种方法的要求。 请帮助我找到getApplicationContext()所在的地方?

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

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

请参阅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实例。 :)

 public class ContactManagerApplication extends Application {
public static Context context = null;

 @Override
public void onCreate() {
    super.onCreate();
    Log.d("@gaurav", getApplicationContext()+"");
    context = getApplicationContext();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM