[英]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()
(因为mPackageInfo
是LoadedApk
实例),这是前面提到的makeApplication()
方法设置的mApplication
字段。
简而言之,在设置完所有这些之后, Application.getApplicationContext()
最终返回...完全相同的Application
实例。 :)
当第一次创建Activity / Service / Receiver实例时,通过setBaseContext
方法设置Context
。 这是调用堆栈:
ContextWrapper :: attachBaseContext < - Application :: attach < - Instrumentation :: newApplication < - LoadedApk :: makeApplication < - ActivityThread :: performLaunchActivity || ActivityThread :: handleReceiver || ActivityThread :: handleCreateService || ActivityThread :: handleBindApplication
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.