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()
调用,因为您使用的是进程内服务。
我想保留对绑定到已启动和已绑定 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()
调用,因为您使用的是进程内服务。