gpt4 book ai didi

android - 为什么解绑服务onDestroy?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:24:33 26 4
gpt4 key购买 nike

我在多个来源中看到过,如果 Activity 绑定(bind)了 Service,它应该在 Destroy 上解除绑定(bind)。为什么?由于 Activity 已被销毁,因此该服务似乎无论如何都会被解除绑定(bind)。如果它是“开始”的——那也没关系。如果它是由 Activity 自动启动的 - 如果没有其他人绑定(bind)它,它无论如何都会关闭。

那为什么要解绑呢?

最佳答案

Activity 需要处理配置更改,例如屏幕旋转、用户更改语言环境或设备进入夜间模式。

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

因此,在 Activity 上调用 bindService() 并不是一个好主意。我们希望绑定(bind)在配置更改期间保持不变。否则,我们的服务将与 Activity 一起销毁并重新创建(假设 Activity 具有唯一绑定(bind)并且没有其他任何东西启动服务)。

因此,推荐的模式是在 Application 单例上调用 bindService()。然后,您可以将您的 ServiceConnection 从旧 Activity 实例传递到新 Activity 实例。保留 fragment 对此非常有用,因为您可以在 fragment onDestroy() 中调用 unbindService(),这样当 Activity 是“永久”销毁(例如,用户按下 BACK,您调用 finish()),您的绑定(bind)可以被释放。


以所有这些为背景,谈谈您的具体问题。

首先,您假设已销毁的 Activity 会自动解除与它通过调用该 ActivitybindService() 绑定(bind)到的任何服务的绑定(bind)。有可能会发生这种情况,但我不记得这是记录在案的行为,开发人员不应依赖这种情况。

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

但是,按照 call-bindService()-on-the-Application 模式,我不希望有一些曾经某种自动解除绑定(bind),因为 Application 单例永远不会被销毁。因此,如果您在某处调用 unbindService() 失败(例如,在保留 fragment 的 onDestroy() 中),您将泄漏您的服务。

关于android - 为什么解绑服务onDestroy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com