从广播接收器向未绑定的服务发送消息
Messaging an unbound service from Broadcast Receiver
目前我的 android 应用程序中有两项服务,为简单起见,我将其称为 DataService
和 CommunicationService
。 DataService
从内容提供程序中检索数据,然后将其序列化并传递给 CommunicationService
。 CommunicationService
然后获取序列化数据并将其分成数据包,一次一个数据包发送给第三方设备。 CommunicationService
知道发送下一个数据包的方式是通过 BroadcastReceiver
.
CommunicationService
由 DataService
启动,但未绑定并且比 DataService
具有更长的生命周期(它在启动 CommunicationService
后立即结束)。 BroadcastReceiver
调用 CommunicationService
上的方法以让它知道是时候发送下一个数据包的最佳方法是什么?我看到的两个想法是:
- 绑定BroadcastReceiver中的服务,调用方法,解绑。这似乎是最好的情况,非常糟糕的做法,最坏的情况是不可行的。
peekService
,尽管看起来这只适用于至少绑定过一次的服务,这排除了它。
我知道这个架构可能看起来有点混乱,但 CommunicationService
的目标是能够在与第三方设备通信的多个应用程序之间重用它;因此,它不能太紧密地绑定到特定的实现。
您的 BroadcastReceiver
可能会超时,因此最好让它调用 IntentService
由于您的目标是让此服务为多个应用程序提供更新,因此每个应用程序都应向该服务注册(通知它可能的更新),然后该服务应为每个已注册的应用程序提供回调。
回调可以由 CommunicationService
指定并执行您喜欢的任何功能,遵循您似乎知道的跨进程通信的标准序列化限制。
所以基本的 "flow" 应该是这样的:
注册 -> 响应回调
BroadcastReceiver
-> IntentService' -> execute callback ->
通讯服务'
直接从 BroadcastReceiver
调用任何东西的主要问题是你的 CommunicationService
可能已经死了,可能导致超时或 NPE。通过回调,它可以检查服务是否存在,如果不存在,则创建它。 IntentReceiver
应该是清醒的。并且提供回调对象允许您在有多个同时调用的情况下更好地控制线程安全代码 and/or 数据排队。
目前我的 android 应用程序中有两项服务,为简单起见,我将其称为 DataService
和 CommunicationService
。 DataService
从内容提供程序中检索数据,然后将其序列化并传递给 CommunicationService
。 CommunicationService
然后获取序列化数据并将其分成数据包,一次一个数据包发送给第三方设备。 CommunicationService
知道发送下一个数据包的方式是通过 BroadcastReceiver
.
CommunicationService
由 DataService
启动,但未绑定并且比 DataService
具有更长的生命周期(它在启动 CommunicationService
后立即结束)。 BroadcastReceiver
调用 CommunicationService
上的方法以让它知道是时候发送下一个数据包的最佳方法是什么?我看到的两个想法是:
- 绑定BroadcastReceiver中的服务,调用方法,解绑。这似乎是最好的情况,非常糟糕的做法,最坏的情况是不可行的。
peekService
,尽管看起来这只适用于至少绑定过一次的服务,这排除了它。
我知道这个架构可能看起来有点混乱,但 CommunicationService
的目标是能够在与第三方设备通信的多个应用程序之间重用它;因此,它不能太紧密地绑定到特定的实现。
您的 BroadcastReceiver
可能会超时,因此最好让它调用 IntentService
由于您的目标是让此服务为多个应用程序提供更新,因此每个应用程序都应向该服务注册(通知它可能的更新),然后该服务应为每个已注册的应用程序提供回调。
回调可以由 CommunicationService
指定并执行您喜欢的任何功能,遵循您似乎知道的跨进程通信的标准序列化限制。
所以基本的 "flow" 应该是这样的:
注册 -> 响应回调
BroadcastReceiver
-> IntentService' -> execute callback ->
通讯服务'
直接从 BroadcastReceiver
调用任何东西的主要问题是你的 CommunicationService
可能已经死了,可能导致超时或 NPE。通过回调,它可以检查服务是否存在,如果不存在,则创建它。 IntentReceiver
应该是清醒的。并且提供回调对象允许您在有多个同时调用的情况下更好地控制线程安全代码 and/or 数据排队。