Android从服务到客户端的通信

Android从服务到客户端的通信,android,android-service,android-service-binding,android-binder,Android,Android Service,Android Service Binding,Android Binder,我想保留对绑定到已启动和绑定的Android服务的每个客户端的引用。我的服务不在单独的流程中 我可以绑定多个客户端,例如-1个活动和2个片段。他们可能都对从服务返回的不同事件的组合感兴趣。理想情况下,我希望在每个客户机绑定时向其注册服务,然后迭代每个连接的客户机并向其发送消息 现在我正在使用绑定器向客户机公开服务的API,但我不喜欢使用广播将数据从服务发送回客户机。感觉很“松”。想知道是否有一种更简洁、更有条理的方法 消息处理程序是一种方法,但我觉得我将丢失客户端当前通过其访问服务API的绑定A

我想保留对绑定到已启动和绑定的Android服务的每个客户端的引用。我的服务不在单独的流程中

我可以绑定多个客户端,例如-1个活动和2个片段。他们可能都对从服务返回的不同事件的组合感兴趣。理想情况下,我希望在每个客户机绑定时向其注册服务,然后迭代每个连接的客户机并向其发送消息

现在我正在使用绑定器向客户机公开服务的API,但我不喜欢使用广播将数据从服务发送回客户机。感觉很“松”。想知道是否有一种更简洁、更有条理的方法


消息处理程序是一种方法,但我觉得我将丢失客户端当前通过其访问服务API的绑定API。

详细介绍的绑定服务方法是合适的。您不必担心
处理程序
,甚至不必担心
意图
(一旦客户端绑定)

参考给定链接中的示例:您可以简单地将功能添加到
LocalService
对象,例如

/** method for clients */
public int getRandomNumber() {
  return mGenerator.nextInt(100);
}

private Set<MyEventListener> mListeners = new HashSet<>();

/** A MyEventListener (your Activity, Fragment, etc.) calls this in its
 * onServiceConnected() method, on the reference it gets from getService(). */
public void registerListener(MyEventListener listener)
{
    mListeners.add(listener);
}

public void sendEvent()
{
    for(MyEventListener listener : mListeners)
    {
         listener.onEvent();
    }
}
/**客户端的方法*/
public int getRandomNumber(){
返回MGGenerator.nextInt(100);
}
私有集mListeners=newhashset();
/**MyEventListener(您的活动、片段等)在其
*onServiceConnected()方法,在它从getService()获取的引用上*/
公共无效注册表侦听器(MyEventListener侦听器)
{
添加(侦听器);
}
public void sendEvent()
{
for(MyEventListener侦听器:MLListeners)
{
listener.onEvent();
}
}

…等等。所有方法在UI线程上同步执行。所有对象(
Services
和客户端(
MyEventListener
)的生存期至少与
ServiceConnection
相同。另外,
ServiceConnection
在您显式解除绑定之前不会遇到
onServiceDisconnected()
调用,因为您使用的是进程内服务。

我确实考虑过这一点,但后来我觉得需要另一种方法来“removeListener()”。而且,我真的不想让每个客户都担心这一点。由于这是一个长期运行的服务,我的服务可能会被不再活动的侦听器填满。我该如何处理呢?您应该更详细地说明您对
removeListener()
方法的反对意见。如果当客户离开时,
服务
将被告知,则必须有人告诉它。如果代码重用是一个问题,那么也许你应该考虑制作一个<代码>片段<代码> >代码>活动> /Cord>子类,该类自动绑定到服务并管理侦听器生命周期。推理是任何其他绑定到服务的开发者和注册他们的侦听者都必须天生知道他们也需要注销它。如果在另一个过程中讨论第三方客户端,这将不起作用。再一次,正确编写的子类可以强制执行这些生命周期规则。但如果这对您的用例来说确实不合理,您可以使用弱引用。请参阅:。