我有一个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;
}
所谓的地方?
注意:请不要发布任何链接到这些问题,因为我已经完成了每个问题,但仍然没有具体的答案。
答案 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()
(因为mPackageInfo
是LoadedApk
实例),这是mApplication
字段设置的makeApplication()
字段{1}}前面提到的方法。
简而言之,在设置完所有内容后,Application.getApplicationContext()
最终会返回...同一个Application
实例。 :)
答案 1 :(得分:6)
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();
}