我已经看到它在多个来源中提到,如果一个Activity绑定一个服务,它应该取消绑定它onDestroy。为什么?由于活动被销毁,似乎该服务无论如何都将被解除绑定。如果它“开始” - 无论如何都没关系。如果它是由活动自动启动的 - 如果没有其他人限制它,它将会关闭。
那么为什么解开呢?
答案 0 :(得分:6)
活动需要处理配置更改,例如旋转屏幕,或用户更改区域设置,或设备进入夜间模式。
当发生配置更改时,前台活动的默认行为是销毁并重新创建它。
因此,在bindService()
上调用Activity
并不是一个好主意。我们希望绑定在配置更改中保持不变。否则,我们的服务将被破坏并重新创建,以及活动(假设活动具有唯一的绑定而没有其他任何东西启动服务)。
因此,推荐的模式是在bindService()
单例上调用Application
。然后,您可以将ServiceConnection
从旧活动实例传递到新活动实例。保留的片段对此非常有用,因为您可以在片段的unbindService()
中调用onDestroy()
,以便在活动被“永久”销毁时(例如,用户按下BACK) ,你打电话给finish()
),你的装订就可以了。
将所有这些作为背景,关注您的具体问题。
首先,假设被销毁的活动会自动从bindService()
上调用的Activity
绑定的任何服务中取消绑定。这种情况可能会发生,但我不记得存在记录的行为,这是开发人员不应该依赖的事情。
更重要的是,在大多数情况下,在bindService()
上调用Activity
并不是正确的做法。否则,你会遇到我在上面概述的问题。
但是,在调用 - bindService()
- on - Application
模式之后,我不希望永远成为某种自动解除绑定,因为{ {1}}单身人士永远不会被摧毁。因此,如果您未能在某处(例如,在保留片段的Application
内)调用unbindService()
,则会泄露您的服务。