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

时间:2013-07-18 02:20:15

标签: android service

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

stopSelf()中致电Service时,onServiceDisconnected()中的Activity未被调用。

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

我错过了什么?

2 个答案:

答案 0 :(得分:29)

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

  

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

答案 1 :(得分:28)

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

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

1)开始服务: 你打电话给startService()开始吧;只有致电stopService()stopSelf()才会停止服务。

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

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

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

  

这两条路径并非完全分开。也就是说,你可以绑定到   已经使用startService()启动的服务。例如,a   可以通过致电startService()来启动背景音乐服务   有一个识别要播放的音乐的意图。可能在以后   用户想要对玩家进行一些控制或获得   关于当前歌曲的信息,一个活动可以绑定到   通过致电bindService()来提供服务。 在这种情况下,   stopService()stopSelf()实际上并未停止服务   直到所有客户解开。

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