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

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

Service调用stopSelf()时,不调用Activity中的onServiceDisconnected()

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

我错过了什么?

Solutions Collecting From Web of "调用Service stopSelf()后没有调用onServiceDisconnected()"

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

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

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

有两种types的服务,“已启动”服务和“绑定”服务。 它们不是相互排斥的。 如果您使用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。