Cod*_*ior 10 android android-context
我有一个Application课我在其中覆盖getApplicationContext().
我查看了Android源代码,我无法找到它所在的位置?
继承层次结构是:
Application -> ContextWrapper -> Context
public abstract Context getApplicationContext();
Run Code Online (Sandbox Code Playgroud)
getApplicationContext()是Context类中的一个抽象方法,它在类中被重写ContextWrapper.
@Override
public Context getApplicationContext() {
return mBase.getApplicationContext();
}
Run Code Online (Sandbox Code Playgroud)
mBase是Context在ContextWrapper的构造函数中初始化的类型的对象的引用,但是根据代码,Application的类构造函数将null传递给super()ie的构造函数的构造函数ContextWrapper.
public Application() {
super(null);
}
Run Code Online (Sandbox Code Playgroud)
现在传递上下文的唯一可能方法是:
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
Run Code Online (Sandbox Code Playgroud)
但也没有对这种方法的要求.请帮助我找到那个getApplicationContext()叫做的地方吗?
注意:请不要发布任何链接到这些问题,因为我已经完成了每个问题,但仍然没有具体的答案.
mat*_*ash 20
我想问的问题是" 对象的attachBaseContext()调用位置是Application什么?"
请参阅Application.java:
/**
* @hide
*/
/* package */ final void attach(Context context) {
attachBaseContext(context);
mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}
Run Code Online (Sandbox Code Playgroud)
如果你进一步向上调用链,你会发现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;
Run Code Online (Sandbox Code Playgroud)
简而言之,提供给Application类的基本Context 是ContextImpl在此方法中创建的实例.
而且,如果你检查ContextImpl.getApplicationContext():
@Override
public Context getApplicationContext() {
return (mPackageInfo != null) ? mPackageInfo.getApplication() : mMainThread.getApplication();
}
Run Code Online (Sandbox Code Playgroud)
你会看到它实际上最终调用LoadedApk.getApplication()(因为mPackageInfo是LoadedApk实例),这是mApplication由makeApplication()前面提到的方法设置的字段.
简而言之,在完成所有这些设置之后,Application.getApplicationContext()最终返回......同样的Application实例.:)
ContextsetBaseContext当第一次创建Activity/Service/Receiver实例时,通过方法设置.这是调用堆栈:
ContextWrapper :: attachBaseContext < - Application :: attach < - Instrumentation :: newApplication < - LoadedApk :: makeApplication < - ActivityThread :: performLaunchActivity || ActivityThread :: handleReceiver || ActivityThread :: handleCreateService || ActivityThread :: handleBindApplication
| 归档时间: |
|
| 查看次数: |
8972 次 |
| 最近记录: |