调用Service stopSelf()后没有调用onServiceDisconnected()

问题描述 投票:22回答:2

我有一个Activity,我开始并绑定下载Service

当在stopSelf()中调用Service时,onServiceDisconnected()中的Activity不会被调用。

我希望它被调用,因为如果Service被停止,所有绑定的活动都应该是未绑定的。

我错过了什么?

android service
2个回答
29
投票

根据官方文档,如果服务崩溃或被杀死,将调用onServiceDisconnected()。链接http://developer.android.com/reference/android/content/ServiceConnection.html

在与服务的连接丢失时调用。这通常发生在托管服务的进程崩溃或被杀死时。这不会删除ServiceConnection本身 - 这种对服务的绑定将保持活动状态,并且当下次运行Service时,您将收到对onServiceConnected(ComponentName,IBinder)的调用。


26
投票

简单地向绑定客户端发送通知并调用stopSelf()(或stopService())实际上不会实现您要执行的操作。您必须在绑定客户端中调用unbindService()(并且该服务必须没有其他绑定客户端)才能实际销毁该服务。

有两种类型的服务,“已启动”服务和“绑定”服务。它们不是相互排斥的。如果您使用startService()启动该服务,则您拥有“已启动”服务。如果您通过bindService()启动服务,它将受到约束。如果你绑定到服务并使用startService(),它们都是。因此,管理服务生命周期有三种可能的选择:

1)开始服务:你打电话给startService()开始服务;只有通过调用stopService()stopSelf()才能停止服务。

2)绑定服务:你打电话给bindService()并传入BIND_AUTO_CREATE标志。其他客户端可以随意绑定和解除绑定服务,当所有客户端分离时,服务将自动销毁。在这种情况下,调用stopService()stopSelf()无效。

3)组合:客户端绑定到服务,您也调用了startService()。在这种情况下,调用stopSelf()stopService()只会在所有客户端分离后销毁服务。同样,当所有客户端都已分离时,服务不会被自动销毁,直到调用stopSelf()stopService()

组合服务生命周期的文档说:

这两条路径并不完全分开。也就是说,您可以绑定到已经使用startService()启动的服务。例如,可以通过使用标识要播放的音乐的Intent调用startService()来启动背景音乐服务。之后,可能当用户想要对播放器进行一些控制或获取有关当前歌曲的信息时,活动可以通过调用bindService()绑定到服务。在这种情况下,stopService()stopSelf()实际上并没有停止服务,直到所有客户解除绑定。

所以在你的情况下,你有一个绑定的客户端。调用stopSelf()不会强制断开绑定的客户端,因此您必须明确通知您的客户端服务要关闭,然后您的客户端必须在服务被销毁之前调用unbindService()。您可以通过各种方式实现这一目标,最简单的方法是通过广播或IBinder界面,或者如果您跨进程与服务进行通信,则可以使用信使或AIDL。

© www.soinside.com 2019 - 2024. All rights reserved.