在我的应用程序中,我设计了一个可以持续获取数据的服务(有充分理由,它来自某些传感器)并将其提供给两个客户端:
在任何时候,这两个客户中的一个或两个都可能正在运行。
我认为此服务应该是绑定服务,而日志服务是已启动服务。
Android documentation表示我应该扩展Binder类,或者如果我想从其他进程访问该服务,请使用Messenger。
这项服务,日志记录服务和UI活动都将在同一个apk中,因此它们可能会在同一个过程中 - 但这将是最好的解决方案吗?我怀疑文档可能没有考虑到我可以在与服务相同的过程中拥有两个客户端的可能性。
由于
答案 0 :(得分:9)
Android documentation清楚地说明了
扩展Binder类
如果您的服务对您自己的应用程序是私有的并且在与客户端(通用)相同的过程中运行,您应该通过扩展Binder类并返回一个实例来创建您的接口。来自onBind()。客户端接收Binder并可以使用它直接访问Binder实现甚至服务中可用的公共方法。
当您的服务仅仅是您自己的应用程序的后台工作程序时,这是首选技术。您不会以这种方式创建界面的唯一原因是因为您的服务被其他应用程序或跨越不同的进程使用。
使用Messenger
如果您需要在不同进程中使用您的界面,则可以使用Messenger为服务创建界面。通过这种方式,服务定义了一个响应不同类型的Message对象的Handler。此Handler是Messenger的基础,然后可以与客户端共享IBinder,允许客户端使用Message对象向服务发送命令。此外,客户端可以定义自己的Messenger,以便服务可以发回消息。
这是执行进程间通信(IPC)的最简单方法,因为Messenger将所有请求排队到一个线程中,这样您就不必将服务设计为线程安全的。
因此,最佳选择是在此服务为本地服务时通过扩展IBinder
类来使用服务。使用Messenger
和AIDL
创建这两项服务时,它们都是远程服务。
答案 1 :(得分:-2)
imrankhan的首选解决方案(Binder)似乎确实有效,但最终我选择了一个Messenger,因为在实践中我发现这个解决方案更灵活,更符合逻辑。