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