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

Mat*_*ins 17 android serviceconnection

在我的Android应用程序,我打电话都startServicebindService:

Intent intent = new Intent(this, MyService.class);
ServiceConnection conn = new ServiceConnection() { ... }

startService(intent)
bindService(intent, conn, BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)

后来,我尝试unbindService and停止服务`:

unbindService(conn);
stopService(intent);
Run Code Online (Sandbox Code Playgroud)

但是,我在调用时遇到异常unbindService.如果我删除此呼叫,该应用似乎通过stopService呼叫正常运行.

难道我做错了什么?我认为bindService呼叫必须与unbindService呼叫相关联,并且startService呼叫必须与stopService呼叫相关联.但是,这似乎并非如此.

Mik*_*ery 26

stopService()的Android文档说明:

请注意,如果停止的服务仍然具有绑定到它的ServiceConnection对象并且设置了BIND_AUTO_CREATE,则在删除所有这些绑定之前不会销毁它.有关服务生命周期的更多详细信息,请参阅服务文档.

所以stopService()先呼叫然后unbindService()应该工作(这对我有用).

  • 啊,听起来我对 `unbindService` 和 `stopService` 的排序是倒退的,我明白了。 (2认同)

rmc*_*c47 8

我遇到这个问题:

确保在调用bindService的相同上下文中调用unbindService.在我的情况下,我正在做以下绑定它:

Context c = getApplicationContext();
c.bindService(...);
Run Code Online (Sandbox Code Playgroud)

然后取消绑定,只需:

unbindService(...);
Run Code Online (Sandbox Code Playgroud)

确保bind和unbind使用相同的上下文解决了问题.


Rof*_*ion 5

正如您在这里看到的,它取决于您想要实现的目标以及如何绑定服务.如果您想长时间引用该服务,最好使用bindService而不是startService.如果在bindService方法中使用了标志BIND_AUTO_CREATE,那么您不必调用startService,因为服务在必要时自行启动.

如果您调用unBind服务,则会删除您对该服务的连接.你不必明确停止服务,但你可以.但需要注意的是,如果你调用unBind(),则允许服务随时停止.

  • 谢谢,但我去过那里,如果我在使用 BIND_AUTO_CREATE 标志绑定到它之前手动启动它,我是否需要取消绑定和停止服务尚不清楚。 (2认同)