从广播接收器向未绑定的服务发送消息

Messaging an unbound service from Broadcast Receiver

目前我的 android 应用程序中有两项服务,为简单起见,我将其称为 DataServiceCommunicationServiceDataService 从内容提供程序中检索数据,然后将其序列化并传递给 CommunicationServiceCommunicationService 然后获取序列化数据并将其分成数据包,一次一个数据包发送给第三方设备。 CommunicationService 知道发送下一个数据包的方式是通过 BroadcastReceiver.

CommunicationServiceDataService 启动,但未绑定并且比 DataService 具有更长的生命周期(它在启动 CommunicationService 后立即结束)。 BroadcastReceiver 调用 CommunicationService 上的方法以让它知道是时候发送下一个数据包的最佳方法是什么?我看到的两个想法是:

我知道这个架构可能看起来有点混乱,但 CommunicationService 的目标是能够在与第三方设备通信的多个应用程序之间重用它;因此,它不能太紧密地绑定到特定的实现。

您的 BroadcastReceiver 可能会超时,因此最好让它调用 IntentService

由于您的目标是让此服务为多个应用程序提供更新,因此每个应用程序都应向该服务注册(通知它可能的更新),然后该服务应为每个已注册的应用程序提供回调。

回调可以由 CommunicationService 指定并执行您喜欢的任何功能,遵循您似乎知道的跨进程通信的标准序列化限制。

所以基本的 "flow" 应该是这样的:

注册 -> 响应回调 BroadcastReceiver -> IntentService' -> execute callback ->通讯服务'

直接从 BroadcastReceiver 调用任何东西的主要问题是你的 CommunicationService 可能已经死了,可能导致超时或 NPE。通过回调,它可以检查服务是否存在,如果不存在,则创建它。 IntentReceiver 应该是清醒的。并且提供回调对象允许您在有多个同时调用的情况下更好地控制线程安全代码 and/or 数据排队。