在我之前的问题中:How to keep and access data in BroadcastReceiver?我得到了很好的答案,但在这里我专注于此。
有BroadcastReceiver,有服务。我想从接收器发送一些数据到服务并获取数据。发起转移的一方是接收方,而不是服务。
为了简单起见,假设接收者等待SCREEN_ON,然后询问服务“这是用户的生日”,服务器返回true或false。
如果我没有弄错,我应该将我的数据附加到服务的意图,并调用startService
,但如何获取数据?
答案 0 :(得分:5)
你不能按照你所描述的方式真正做到这一点。 @CommonsWare是正确的,您选择的架构存在缺陷。
BroadcastReceiver
是短暂的。因此,他们无法进行任何异步调用,也无法执行任何需要“大量时间”的任务。您的BroadcastReceiver
会被某个事件触发,如果由于该事件需要执行大量工作,则需要将该工作委托给Service
。
通常(例如:在Activity
内),如果您想要从Service
请求信息,您可以绑定到Service
并对服务进行同步调用请求您想要的数据或者您可以异步调用服务(即:向其发送Intent
),然后监听返回的结果(使用BroadcastReceiver
)。这些方法都不适用于BroadcastReceiver
,因为BroadcastReceiver
无法绑定到Service
,并且无法进行异步调用。
编辑:复制Android documentation的相关信息,以供参考
接收器生命周期
BroadcastReceiver
对象仅在通话期间有效 到onReceive(Context, Intent)
。一旦你的代码从此返回 功能,系统认为要完成的对象不再 活性这对你能做些什么有重要的影响
onReceive(Context, Intent)
实施:任何需要的东西 异步操作不可用,因为您需要 从函数返回来处理异步操作,但是在 那一点BroadcastReceiver
不再活跃,因此 系统可以在异步操作之前自由地终止其进程 完成。特别是,您可能无法显示对话框或绑定到服务 在
BroadcastReceiver
内。对于前者,你应该使用NotificationManager
API。对于后者,你可以使用Context.startService()
向服务发送命令。
答案 1 :(得分:0)
使用会话! 将数据保存在会话中:
@Override
public void onReceive(Context context, Intent intent)
{
SessionManager session = new SessionManager(context);
// get user data from session
HashMap<String, Object> user = session.getUserDetails();
// name
m_userId = (int)user.get(SessionManager.KEY_ID);
m_context = context;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
// Put here YOUR code.
//Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
wl.release();
}