调用getApplicationContext()时调用的代码在哪里?

我只是出于兴趣考虑Android的来源 。 我发现Context是一个具有抽象方法的抽象类:

 public abstract Context getApplicationContext(); 

ContextWrapper.java扩展了导致实现getApplicationContext()方法的Context.java

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

但是mBase是指在ContextWrapper的构造函数中初始化Contexttypes的对象:

 public ContextWrapper(Context base) { mBase = base; } 

那么这个mBase引用是指abstract类? 那么,我只是不明白在你的Activity调用getApplicationContext()时执行的代码在哪里。

Solutions Collecting From Web of "调用getApplicationContext()时调用的代码在哪里?"

这是多态的一个有趣的例子。

只要您的base扩展Context ,它必须提供一个getApplicationContext()的实现,在ContextWrapper的情况下是您在这里提供的代码。 有这个实现,并在ContextImpl的一个 。

在阅读你提供的代码时,注意几件事情是很重要的: ContextWrapper本身扩展了Context ,但是它也把Context作为一个input(可以是ContextWrapper ,或者一个Service ,或者一个Application ,或者一个Activity )。 ContextWrapper不关心它是哪种types; 它只是知道他们有一个getApplicationContext方法,并且在调用时想调用这个方法。 (例如,它可以通过另一个ContextWrapper ,但是因为所述的ContextWrapper在它的构造函数中也需要一个Context ,这只会增加另一个嵌套级别。)

Application extends ContextWrapper类的调用super(null) ,这意味着getApplicationContext()会抛出一个NullPointerException – 但是,在ContextWrapper它也可以通过attachBaseContext(Context) ,这就是它变得有趣的地方。

ActivityApplication都有方法attach(Context [...other stuff]) 。 每个人都使用传入的Context来调用attachBaseContext()

  • Instrumentation类中,您将findandroid.app.Instrumentation.newApplication() ,其中创build了一个ContextImpl ,并将其传递给一个Application
  • ActivityThread类中,你会发现handleBindApplication ,它创build了一个ContextImpl ,作为它的根Context被传递给Activity
  • LoadedApk类中,您将findmakeApplication ,它创build一个传递给ApplicationContextImpl 。 这是所谓的地方。

所以,在一天结束时, mBase通常以ContextImpl结尾。

我在查找所有这些时看到的潜在有用的链接:

  • attach用法
  • attachBaseContext用法