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

时间:2012-10-12 13:07:18

标签: android service broadcastreceiver

在我之前的问题中:How to keep and access data in BroadcastReceiver?我得到了很好的答案,但在这里我专注于此。

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

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

如果我没有弄错,我应该将我的数据附加到服务的意图,并调用startService,但如何获取数据?

2 个答案:

答案 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();
}