我有一个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()
ie的构造函数的构造函数ContextWrapper
.
public Application() { super(null); }
现在传递上下文的唯一可能方法是:
protected void attachBaseContext(Context base) { if (mBase != null) { throw new IllegalStateException("Base context already set"); } mBase = base; }
但也没有对这种方法的要求.请帮助我找到那个getApplicationContext()
叫做的地方吗?
注意:请不要发布任何链接到这些问题,因为我已经完成了每个问题,但仍然没有具体的答案.
我想问的问题是" 对象的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()
(因为mPackageInfo
是LoadedApk
实例),这是mApplication
由makeApplication()
前面提到的方法设置的字段.
简而言之,在完成所有这些设置之后,Application.getApplicationContext()
最终返回......同样的Application
实例.:)
Context
setBaseContext
当第一次创建Activity/Service/Receiver实例时,通过方法设置.这是调用堆栈:
ContextWrapper :: attachBaseContext < - Application :: attach < - Instrumentation :: newApplication < - LoadedApk :: makeApplication < - ActivityThread :: performLaunchActivity || ActivityThread :: handleReceiver || ActivityThread :: handleCreateService || ActivityThread :: handleBindApplication