class

context0.png

context数量

一般都认为是:activity数目+Service数目+Application数目。虽然activity和service,application都间接继承context。但是仅仅用来维护其生命周期。内部context的成员变量才是我们想要的上下文对象。
context1.png

context scope

context2.png

如果我们用ApplicationContext去启动一个LaunchMode为standard的Activity的时候会报错

android.util.AndroidRuntimeException: Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

在Application和Service中去layout inflate也是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。所以这种方式也不推荐使用。

一句话总结:凡是跟UI相关的,都应该使用Activity做为Context来处理;其他的一些操作,Service,Activity,Application等实例都可以,当然了,注意Context引用的持有,防止内存泄漏。

一般Context造成的内存泄漏,几乎都是当Context销毁的时候,却因为被引用导致销毁失败,而Application的Context对象可以理解为随着进程存在的,所以我们总结出使用Context的正确姿势:

  • 1:当Application的Context能搞定的情况下,并且生命周期长的对象,优先使用Application的Context。
  • 2:不要让生命周期长于Activity的对象持有到Activity的引用。
  • 3:尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。