0

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

有广播接收器和服务。我想从接收器发送一些数据到服务并取回数据。发起传输的一方是接收方,而不是服务方。

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

如果我没记错的话,我应该将发送到服务的数据附加到 Intent,然后调用startService,但是如何取回数据?

4

2 回答 2

5

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

BroadcastReceivers 是短暂的。因此,它们不能进行任何异步调用,也不能执行任何需要“大量时间”的任务。您BroadcastReceiver会被某个事件触发,如果由于该事件您需要做大量工作,您需要将该工作委托给Service.

通常(例如:在 a 中Activity),如果您想从 a 请求信息,Service您可以绑定到Service并同步调用服务以请求您想要的数据,或者您可以异步调用服务(即:发送Intent到它),然后监听返回的结果(使用 a BroadcastReceiver)。这些方法都不能从 a 工作,BroadcastReceiver因为 aBroadcastReceiver不能绑定到 aService并且它不能进行异步调用。

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

接收器生命周期

BroadcastReceiver对象仅在调用期间有效onReceive(Context, Intent)。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。

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

特别是,您可能不会显示对话框或从BroadcastReceiver. 对于前者,您应该改用 NotificationManagerAPI。对于后者,您可以使用 Context.startService()向服务发送命令。

于 2012-10-12T14:21:12.053 回答
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();
}
于 2015-12-08T21:57:52.463 回答