1. 继承关系
继承关系2. 作用域
作用域3. 获取Context
通常我们想要获取 Context 对象,主要有以下四种方法:
-
View.getContext
:返回当前 View 对象的 Context 对象,通常是当前正在展示的 Activity 对象。 -
Activity.getApplicationContext
:获取当前 Activity 所在的(应用)进程的 Context 对象,通常我们使用 Context 对象时,要优先考虑这个全局的进程 Context 。 -
ContextWrapper.getBaseContext()
:用来获取一个 ContextWrapper 进行装饰之前的 Context ,可以使用这个方法,实际开发中使用并不多,也不建议使用。 -
Activity.this
: 返回当前的 Activity 实例,如果是 UI 控件需要使用 Activity 作为 Context 对象,但是默认的 Toast 实际上使用 ApplicationContext 也可以。
getApplication() 和 getApplicationContext() 有什么区别和联系?
返回的都是 Application 对象,但是作用域不同。getApplication() 方法只有在 Activity 和 Service 中才能调用的到。如果在一些其它的场景,比如 BroadcastReceiver 中也想获得 Application 的实例,这时就可以借助 getApplicationContext() 方法了。
4. 正确使用Context
- 当 Application 的 Context 能搞定的情况下,并且生命周期长的对象,优先使用 Application 的 Context。
- 不要让生命周期长于 Activity 的对象持有到 Activity 的引用。
- 尽量不要在 Activity 中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。
网友评论