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

时间:2014-07-22 09:40:45

标签: android android-context

我有一个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()的构造函数,即{{{}的构造函数1}}。

ContextWrapper

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

public Application() {
    super(null);
}

但也没有调用此方法。请帮助我找到protected void attachBaseContext(Context base) { if (mBase != null) { throw new IllegalStateException("Base context already set"); } mBase = base; } 所谓的地方?

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

3 个答案:

答案 0 :(得分:19)

我想问题是#34; 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实例),这是mApplication字段设置的makeApplication()字段{1}}前面提到的方法。

简而言之,在设置完所有内容后,Application.getApplicationContext()最终会返回...同一个Application实例。 :)

答案 1 :(得分:6)

当第一次创建Activity / Service / Receiver实例时,

Context通过setBaseContext方法设置。这是调用堆栈:

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

答案 2 :(得分:0)

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

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

}