我有一项服务已启动。此外,其他组件可以绑定到服务。当组件绑定到服务时,它具有需要提供给服务的新参数。是否有可能在每次调用者需要绑定时强制调用onBind(以便通过intent传递新数据)?如果是这样,每次调用onBind会产生额外的开销吗?顺便说一句,这是一个本地服务,我扩展Binder而不是使用Messenger。
答案 0 :(得分:3)
几点需要考虑:
1)只为第一个绑定请求调用onBind()。所有后续调用都不会导致调用onBind。以下是Google doc对此的摘录:
多个客户端可以立即连接到该服务。但是,系统会调用您服务的onBind()方法,以便仅在第一个客户端绑定时检索IBinder。然后,系统将相同的IBinder传递给任何其他绑定的客户端,而无需再次调用onBind()。
因此,每次调用者发送绑定请求时,都不应期望调用onBind。
2)使用从onBind()返回的实例,调用者可以访问服务的公共方法。您可以使用一个公共方法来发送任何参数。以下是Google doc:
如果您的服务对您自己的应用程序是私有的并且在与客户端相同的进程中运行(这是常见的),您应该通过扩展Binder类并从onBind()返回它的实例来创建您的接口。 。客户端收到Binder,可以使用它直接访问Binder实现甚至服务中可用的公共方法。
3)Google建议不要在bindService的intent参数中使用任何Extra参数。这可能是由于上面提到的第1)点。以下摘自Google doc:
用于绑定到此服务的Intent,如Context.bindService所示。请注意,此处不会显示Intent中包含的任何额外内容。
如果没有其他需要使其成为绑定服务,您可以简单地将其用作启动服务,并在用于启动服务的意图中传递额外参数。该意图将在onStartCommand()中提供。如果由于其他原因需要绑定服务,您可以使用上面的选项2)或遵循此处提到的更复杂的方法: