我有一个Activity我开始并绑定到下载Service.
在呼叫stopSelf()时Service,onServiceDisconnected()在Activity未呼叫时.
我希望它被调用,因为如果Service停止,所有绑定的活动都应该是未绑定的.
我错过了什么?
Hoa*_*yen 29
根据官方文档,如果服务崩溃或被杀死,将调用onServiceDisconnected().链接http://developer.android.com/reference/android/content/ServiceConnection.html
在与服务的连接丢失时调用.这通常发生在托管服务的进程崩溃或被杀死时.这不会删除ServiceConnection本身 - 这种对服务的绑定将保持活动状态,并且当下次运行Service时,您将收到对onServiceConnected(ComponentName,IBinder)的调用.
d37*_*3ur 29
简单地向绑定的客户端发送通知并调用stopSelf()(或stopService())实际上不会完成您要执行的操作.您必须unbindService()在绑定的客户端中调用(并且该服务必须没有其他绑定的客户端)才能实际销毁该服务.
有两种类型的服务,"已启动"服务和"绑定"服务.它们不是相互排斥的.如果您使用了服务startService(),则可以使用"已启动"服务.如果您启动服务bindService(),它将受到约束.如果绑定到服务并使用startService(),则两者都是.因此,管理服务生命周期有三种可能的选择:
1)开始服务:你打电话startService()来启动它; 只有通过调用stopService()或停止服务stopSelf().
2)绑定服务:你打电话bindService()并传递BIND_AUTO_CREATE旗帜.其他客户端可以随意绑定和解除绑定服务,当所有客户端分离时,服务将自动销毁.在这种情况下,呼叫stopService()或stopSelf()无效.
3)组合:客户端绑定到服务,您也已调用startService().在这种情况下,调用stopSelf()或stopService()仅在所有客户端分离后销毁服务.同样,当所有客户端都已分离,直到stopSelf()或被stopService()调用时,服务不会自动销毁.
组合服务生命周期的文档说:
这两条路径并不完全分开.也就是说,您可以绑定到已经启动的服务
startService().例如,可以通过startService()使用标识要播放的音乐的Intent 进行呼叫来启动背景音乐服务.稍后,可能当用户想要对播放器进行一些控制或获得关于当前歌曲的信息时,活动可以通过呼叫绑定到服务bindService().在这种情况下,stopService()或者stopSelf()在所有客户解除绑定之前实际上不会停止服务.
所以在你的情况下,你有一个绑定的客户端.调用stopSelf()不会强制断开绑定的客户端,因此您必须明确地通知您的客户端服务要关闭,然后您的客户端必须unbindService()在服务被销毁之前调用.您可以通过各种方式实现这一目标,最简单的方法是通过广播或IBinder界面,或者如果您跨进程与服务进行通信,则可以使用信使或AIDL.
| 归档时间: |
|
| 查看次数: |
15675 次 |
| 最近记录: |