为什么取消绑定Service onDestroy?

时间:2017-02-07 21:10:38

标签: android android-service

我已经看到它在多个来源中提到,如果一个Activity绑定一个服务,它应该取消绑定它onDestroy。为什么?由于活动被销毁,似乎该服务无论如何都将被解除绑定。如果它“开始” - 无论如何都没关系。如果它是由活动自动启动的 - 如果没有其他人限制它,它将会关闭。

那么为什么解开呢?

1 个答案:

答案 0 :(得分:6)

活动需要处理配置更改,例如旋转屏幕,或用户更改区域设置,或设备进入夜间模式。

当发生配置更改时,前台活动的默认行为是销毁并重新创建它。

因此,在bindService()上调用Activity并不是一个好主意。我们希望绑定在配置更改中保持不变。否则,我们的服务将被破坏并重新创建,以及活动(假设活动具有唯一的绑定而没有其他任何东西启动服务)。

因此,推荐的模式是在bindService()单例上调用Application。然后,您可以将ServiceConnection从旧活动实例传递到新活动实例。保留的片段对此非常有用,因为您可以在片段unbindService()中调用onDestroy(),以便在活动被“永久”销毁时(例如,用户按下BACK) ,你打电话给finish()),你的装订就可以了。

将所有这些作为背景,关注您的具体问题。

首先,假设被销毁的活动会自动从bindService()上调用的Activity绑定的任何服务中取消绑定。这种情况可能会发生,但我不记得存在记录的行为,这是开发人员不应该依赖的事情。

更重要的是,在大多数情况下,在bindService()上调用Activity并不是正确的做法。否则,你会遇到我在上面概述的问题。

但是,在调用 - bindService() - on - Application模式之后,我不希望永远成为某种自动解除绑定,因为{ {1}}单身人士永远不会被摧毁。因此,如果您未能在某处(例如,在保留片段的Application内)调用unbindService(),则会泄露您的服务。