何时调用Application类的getApplicationContext()?

我有一个Application类,其中我重写getApplicationContext()

我看了Android的源代码,我无法find它的名字?

inheritance层次是:

Application -> ContextWrapper -> Context

 public abstract Context getApplicationContext(); 

getApplicationContext()Context类中的一个抽象方法,在ContextWrapper类中被覆盖。

 @Override public Context getApplicationContext() { return mBase.getApplicationContext(); } 

mBaseContext的types的对象的引用,它在ContextWrapper的构造函数中被初始化,但是根据代码,应用程序的类构造函数将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; } 

但是这个方法也没有调用。 请帮我findgetApplicationContext()从哪里getApplicationContext()呢?

注意:请不要发布任何链接到我经历过的每一个问题,但仍然没有具体的答案。

Solutions Collecting From Web of "何时调用Application类的getApplicationContext()?"

我想这个问题是相当“在哪里是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实例,正是在这个方法中创build的。

而且,如果您检查ContextImpl.getApplicationContext()

 @Override public Context getApplicationContext() { return (mPackageInfo != null) ? mPackageInfo.getApplication() : mMainThread.getApplication(); } 

你会发现它实际上最终调用了LoadedApk.getApplication() (因为mPackageInfoLoadedApk实例),这是前面提到的makeApplication()方法设置的mApplication字段。

总之,毕竟这是build立, Application.getApplicationContext()结束返回…非常相同的Application实例。 🙂

Context是通过setBaseContext方法设置的,当一个Activity / Service / Receiver实例第一次被创build时。 这是调用堆栈:

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(); }