[英]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.