Android 从服务到客户端的通信

Android communicating from Service to Clients

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

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

现在我正在使用 Binder 将服务的 API 公开给客户端,但我不喜欢使用广播将数据从服务发送回客户端。感觉很"loose"。想知道是否有更简洁和结构化的方法?

Message Handler 是一种方式,但我觉得我会丢失 binder API 客户端当前正在通过 API 访问服务。

绑定服务 方法详细here 是合适的。您不必担心 Handlers,甚至 Intents(一旦客户端绑定)。

参考给定 link 处的示例:您可以简单地向 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();
    }
}

...等等。所有方法在 UI 线程上同步执行。所有对象(Services 和客户端(MyEventListener))的生命周期都保证至少与 ServiceConnection 一样长。此外,在您明确解除绑定之前,ServiceConnection 不会遇到 onServiceDisconnected() 调用,因为您使用的是进程内服务。