Android API 中的几个类在Context
其构造函数中需要一个参数,例如ArrayAdapter
,SQLiteOpenHelper
或Intent
. 从 内部创建这样的对象时Activity
,哪个上下文实例更适合传递给它们:(this
活动实例本身)或活动getApplicationContext()
方法返回的对象,为什么?
到目前为止,我都使用了这两种方法,并且没有看到结果功能有任何区别。有什么经验法则吗?
Android API 中的几个类在Context
其构造函数中需要一个参数,例如ArrayAdapter
,SQLiteOpenHelper
或Intent
. 从 内部创建这样的对象时Activity
,哪个上下文实例更适合传递给它们:(this
活动实例本身)或活动getApplicationContext()
方法返回的对象,为什么?
到目前为止,我都使用了这两种方法,并且没有看到结果功能有任何区别。有什么经验法则吗?
从getApplicationContext()
方法的文档:
返回当前进程的单个全局应用程序对象的上下文。这通常只应在您需要一个生命周期与当前上下文分离的上下文时使用,该上下文与进程的生命周期而不是当前组件相关联。
例如考虑它如何与 {@ #registerReceiver(BroadcastReceiver, IntentFilter)} 交互:
如果从 Activity 上下文中使用,则接收器正在该 Activity 中注册。这意味着您应该在活动完成被销毁之前取消注册;事实上,如果您不这样做,框架将在删除活动并记录错误时清理您泄露的注册。因此,如果您使用 Activity 上下文来注册一个静态的接收器(对于进程来说是全局的,不与 Activity 实例关联),那么无论您使用的 Activity 被销毁的任何时候,该注册都会在您身上被删除。
如果从此处返回的 Context 中使用,则接收器正在使用与您的应用程序关联的全局状态进行注册。因此,它永远不会为您取消注册。如果接收器与静态数据相关联,而不是特定组件,则这是必要的。但是,如果您忘记取消注册、取消绑定等,在其他地方使用 ApplicationContext 很容易导致严重的泄漏。