19

在我的 Android 应用程序中,我同时调用了startServiceand bindService

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

startService(intent)
bindService(intent, conn, BIND_AUTO_CREATE);

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

unbindService(conn);
stopService(intent);

但是,我在调用unbindService. 如果我删除此呼叫,则该应用程序似乎可以通过stopService呼叫正常运行。

难道我做错了什么?我认为bindService呼叫必须与unbindService呼叫相关联,startService呼叫必须与stopService呼叫相关联。不过,这里的情况似乎并非如此。

4

4 回答 4

29

stopService() 的 Android 文档指出:

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

所以先打电话stopService()然后unbindService()应该工作(它对我有用)。

于 2011-02-20T02:29:57.747 回答
8

我遇到的一个问题:

确保在调用 bindService 的同一上下文中调用 unbindService。就我而言,我正在执行以下操作来绑定它:

Context c = getApplicationContext();
c.bindService(...);

然后解除绑定,只需:

unbindService(...);

确保 bind 和 unbind 都使用相同的上下文解决了这个问题。

于 2011-04-20T16:41:28.457 回答
5

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

如果您调用 unBind 服务,那么您与该服务的关联将被删除。您不必明确停止服务,但可以。但需要注意的是,如果您调用 unBind(),那么服务可以随时停止。

于 2010-08-02T07:40:42.477 回答
0

要直接回答您的问题,不调用 unbindservice 是“可以的”,但不建议这样做。发生的情况是,如果您的服务不是前台服务,android 系统可能会杀死它以释放内存。如果还有一些组件绑定到它,但你没有调用 unbind,它就会被 android 系统解除绑定。

在此处查看 android 文档

https://developer.android.com/guide/components/bound-services

如果您的应用程序销毁客户端时您的客户端仍绑定到服务,则销毁会导致客户端解除绑定。更好的做法是在客户端完成与服务的交互后立即解除绑定。这样做允许空闲服务关闭。有关绑定和取消绑定的适当时间的更多信息,请参阅附加说明。

于 2019-08-01T21:41:37.427 回答