如何在Service和BroadcastReceiver之间发送和获取数据?

gre*_*man 0 service android broadcastreceiver

在我之前的问题中:如何在BroadcastReceiver中保留和访问数据?我有很好的答案,但在这里我专注于此.

有BroadcastReceiver,有服务.我想从接收器发送一些数据到服务并获取数据.发起转移的一方是接收方,而不是服务方.

为了简单起见,假设接收者等待SCREEN_ON然后询问服务"这是用户的生日",服务器返回true或false.

如果我没有弄错的话,我应该将我的数据附加到Service的Intent,然后调用startService,但是如何获取数据?

Dav*_*ser 5

你不能按照你所描述的方式真正做到这一点.@CommonsWare是正确的,您选择的架构是有缺陷的.

BroadcastReceivers是短命的.因此,他们无法进行任何异步调用,也无法执行任何需要"大量时间"的任务.您BroadcastReceiver会被某个事件触发,如果由于该事件需要做大量的工作,您需要将该工作委托给a Service.

通常(例如:在一个内Activity),如果你想要从你那里请求信息,Service你可以绑定Service到服务器并对服务进行同步调用以请求你想要的数据,或者你可以异步调用服务(即:发送一个Intent到it)然后监听返回的结果(使用a BroadcastReceiver).这些方法都不适用于a,BroadcastReceiver因为a BroadcastReceiver无法绑定到a Service并且无法进行异步调用.

编辑:从Android文档中复制相关信息,以供参考

接收器生命周期

一个BroadcastReceiver对象仅适用于呼叫的持续时间onReceive(Context, Intent).一旦您的代码从此函数返回,系统将认为该对象已完成且不再处于活动状态.

这会对您在onReceive(Context, Intent)实现中可以执行的操作产生重要影响 :任何需要异步操作的东西都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver它不再处于活动状态,因此系统不再在异步操作完成之前可以自由地终止它的进程.

特别是,您可能无法显示对话框或绑定到服务中的服务BroadcastReceiver.对于前者,您应该使用 NotificationManagerAPI.对于后者,您可以使用 Context.startService()向服务发送命令.