我是否需要为Android服务调用unbindService和stopService?

时间:2010-08-02 06:40:44

标签: android serviceconnection

在我的Android应用中,我同时拨打startServicebindService

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来电相关联。但这似乎并非如此。

4 个答案:

答案 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

  

如果您的客户端在应用程序销毁应用程序时仍绑定到服务   客户端,销毁会导致客户端解除绑定。这是更好的做法   与客户端互动后立即解除绑定   服务。这样可以关闭空闲服务。欲了解更多   有关绑定和取消绑定的适当时间的信息,请参阅附加   笔记。