我想保留对绑定到启动并绑定的Android服务的每个客户端的引用。我的服务不在单独的过程中。
我可以绑定多个客户端,例如-1个活动和2个片段。他们可能都对从服务返回的不同事件的组合感兴趣。理想情况下,我想在每个客户端绑定时向该服务注册,然后遍历每个连接的客户端并向其发送消息。
现在,我正在使用Binder将服务的API公开给客户端,但是我不满意使用广播将数据从服务发送回客户端。感觉很“松”。想知道是否有更简洁和结构化的方法吗?
消息处理程序是一种方法,但是我感觉我将失去客户端当前通过其访问服务API的绑定器API。
Bound Service详细方法here是合适的。您不必担心Handlers
甚至Intents
(一旦绑定了客户端)。
参考给定链接上的示例:您可以简单地向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()
调用。