簡體   English   中英

什么時候調用Application類的getApplicationContext()?

[英]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() (因為mPackageInfoLoadedApk實例),這是前面提到的makeApplication()方法設置的mApplication字段。

簡而言之,在設置完所有這些之后, Application.getApplicationContext()最終返回...完全相同的Application實例。 :)

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM