我有一个后台服务,当我在UI上按下相应的按钮时,我开始并停止使用startService()
和stopService()
(分别是“连接”和“断开连接”)。
当服务停止时,我执行了很多清理操作,并且我将它们放在服务的onDestroy()
中,假设只要调用stopService()
就会调用它们。但是,我发现在调用onDestroy()
时不会立即调用stopService()
。它可能会在一段时间内调用,或者在非常很长时间之后调用。
我可以做些什么来确保在调用stopService()
后立即执行清理操作(只要有人点击“断开连接”按钮就会触发)?我是否 采用bindService()
方法,还是有其他方法?
注意:该服务在同一个应用程序中独立运行。
答案 0 :(得分:2)
来自文档:
请求停止使用stopSelf()或stopService()系统 尽快销毁服务。
但是,如果您的服务处理多个onStartCommand()请求 同时,你不应该在完成后停止服务 处理一个开始请求,因为你可能已经收到了一个 新的启动请求(在第一个请求结束时停止) 终止第二个)。要避免此问题,您可以使用 stopSelf(int)确保您停止服务的请求 始终基于最近的启动请求。也就是说,当你打电话 stopSelf(int),你传递开始请求的ID(startId 传递给停止请求所对应的onStartCommand())。 然后,如果服务在您能够之前收到新的启动请求 要调用stopSelf(int),那么ID将不匹配,服务将匹配 不要停止。
由于stopSelf()
或stopService()
会尽快终止服务,因此可能还有其他因素会使其保持活跃状态(因为您说onDestory()
有时需要很长时间这似乎就是这种情况)。您可能希望监视服务是否存在可能阻止服务及时关闭的传入活动。
答案 1 :(得分:0)
致电finish()
中的stopService()
。这将调用onDestroy()