我有一个Activity
在其中启动并绑定到下载的Service
.
在调用stopSelf()
中时Service
,onServiceDisconnected()
在Activity
中不调用。
我希望它会被调用,因为如果Service
停止,所有绑定的活动都应该是未绑定的。
我错过了什么?
根据官方文档,如果服务崩溃或被杀死,将调用 onServiceDisconnected()。链接http://developer.android.com/reference/android/content/ServiceConnection.html
当与服务的连接丢失时调用。这通常发生在托管服务的进程崩溃或被终止时。这不会删除 ServiceConnection 本身 - 与服务的绑定将保持活动状态,并且当服务下次运行时,您将收到对 onServiceConnected(ComponentName, IBinder) 的调用。
简单地向绑定的客户端发送通知并调用stopSelf()
(或stopService()
)实际上不会完成您尝试做的事情。您必须调用unbindService()
绑定的客户端(并且服务必须没有其他绑定的客户端)才能真正销毁服务。
有两种类型的服务,“已启动”服务和“绑定”服务。它们不是相互排斥的。如果您使用 启动该服务startService()
,则您有一个“已启动”服务。如果通过 启动服务bindService()
,则绑定。如果您绑定到服务并且还使用startService()
,则两者都是。因此,管理服务的生命周期有三种可能的选择:
1)Started Service:你调用startService()
启动它;服务只会通过调用stopService()
或来停止stopSelf()
。
2)绑定服务:您调用bindService()
并传递BIND_AUTO_CREATE
标志。其他客户端可以随意绑定和解绑服务,当所有客户端都分离后,服务会自动销毁。在这种情况下,调用stopService()
orstopSelf()
没有任何效果。
3)组合:客户端绑定到服务,您还调用了startService()
. 在这种情况下,调用stopSelf()
orstopService()
只会在所有客户端分离后销毁服务。同样,当所有客户端都分离时,服务不会自动销毁,直到stopSelf()
或stopService()
已经被调用。
组合服务生命周期的文档说:
这两条路径并不完全分开。也就是说,您可以绑定到已经以
startService()
. 例如,可以通过startService()
使用标识要播放的音乐的 Intent 调用来启动背景音乐服务。稍后,可能当用户想要对播放器进行一些控制或获取有关当前歌曲的信息时,活动可以通过调用绑定到服务bindService()
。在这种情况下,stopService()
或者stopSelf()
直到所有客户端解除绑定才真正停止服务。
所以在你的情况下,你有一个绑定的客户。调用stopSelf()
不会强制断开绑定的客户端,因此您必须明确通知您的客户端该服务要关闭,然后您的客户端必须unbindService()
在服务被销毁之前调用。您可以通过多种方式实现这一点,最简单的是通过广播或 IBinder 接口,或者如果您跨进程与服务通信,则可以通过信使或 AIDL。