在我的Android应用中,我同时拨打startService
和bindService
:
Intent intent = new Intent(this, MyService.class);
ServiceConnection conn = new ServiceConnection() { ... }
startService(intent)
bindService(intent, conn, BIND_AUTO_CREATE);
稍后,我尝试unbindService and
stopService`:
unbindService(conn);
stopService(intent);
但是,我在调用unbindService
时遇到异常。如果我删除了此通话,则该应用似乎可以通过stopService
通话正常运行。
我做错了吗?我认为bindService
来电必须与unbindService
来电相关联,并且startService
来电必须与stopService
来电相关联。但这似乎并非如此。
答案 0 :(得分:26)
stopService()的Android文档声明:
请注意,如果停止的服务仍然具有绑定到它的ServiceConnection对象并且设置了BIND_AUTO_CREATE,则在删除所有这些绑定之前不会销毁它。有关服务生命周期的更多详细信息,请参阅服务文档。
首先调用stopService()
然后调用unbindService()
应该有效(这对我有用)。
答案 1 :(得分:8)
我遇到了这个问题:
确保在调用bindService的相同上下文中调用unbindService。就我而言,我正在做以下事情来绑定它:
Context c = getApplicationContext();
c.bindService(...);
然后解开它,只是:
unbindService(...);
确保bind和unbind使用相同的上下文解决了问题。
答案 2 :(得分:5)
正如您所见here,它取决于您想要实现的目标以及如何绑定服务。如果您想长时间引用该服务,最好使用bindService而不是startService。如果在bindService方法中使用了标志BIND_AUTO_CREATE,那么您不必调用startService,因为服务会在必要时自行启动。
如果您调用unBind服务,则会删除您对该服务的处理。你不必明确停止服务,但你可以。但值得注意的是,如果你调用unBind(),那么服务可以随时停止。
答案 3 :(得分:0)
要直接回答您的问题,不调用unbindservice是可以的,但是不建议这样做。发生的是,如果您的服务不是前台服务,则android系统可能会杀死它以释放内存。并且如果仍然有一些组件绑定到它,但是您还没有调用unbind,它将被android系统取消绑定。
在此处查看android文档
https://developer.android.com/guide/components/bound-services
如果您的客户端在应用程序销毁应用程序时仍绑定到服务 客户端,销毁会导致客户端解除绑定。这是更好的做法 与客户端互动后立即解除绑定 服务。这样可以关闭空闲服务。欲了解更多 有关绑定和取消绑定的适当时间的信息,请参阅附加 笔记。