Android 如何在服务和广播接收器之间发送和获取数据?

Android 如何在服务和广播接收器之间发送和获取数据?,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,在我的上一个问题中:我得到了很好的答案,但这里我将重点放在这一点上 有广播接收机,也有服务。我想将一些数据从接收器发送到服务,并将数据取回。发起传输的一方是接收方,而不是服务 为了简单起见,假设接收者等待屏幕打开,然后询问服务“这是用户的生日吗”,服务器返回true或false 如果我没有弄错的话,我应该将我的数据附加到服务目的上,然后调用startService,但是如何取回数据呢?你不能按照你描述的方式来做@Commonware是正确的,您选择的架构有缺陷 广播接收器的寿命很短。因此,它们不

在我的上一个问题中:我得到了很好的答案,但这里我将重点放在这一点上

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

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


如果我没有弄错的话,我应该将我的数据附加到服务目的上,然后调用
startService
,但是如何取回数据呢?

你不能按照你描述的方式来做@Commonware是正确的,您选择的架构有缺陷

广播接收器
的寿命很短。因此,它们不能进行任何异步调用,也不能执行任何花费“大量时间”的任务。您的
BroadcastReceiver
由某个事件触发,如果您因该事件需要执行大量工作,则需要将该工作委托给
服务

通常(例如:在
活动中
),如果您想从
服务
请求信息,您可以绑定到
服务
并对该服务进行同步调用以请求所需的数据,也可以异步调用该服务(即:向其发送
意图
)然后收听返回的结果(使用
BroadcastReceiver
)。这两种方法都不适用于
BroadcastReceiver
,因为
BroadcastReceiver
不能绑定到
服务
,也不能进行异步调用

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

接收器生命周期

BroadcastReceiver
对象仅在呼叫期间有效 接收(上下文、意图)。一旦你的代码从这里返回 功能,系统认为对象已完成,不再 活跃的

这对你在工作中能做什么有着重要的影响
onReceive(上下文、意图)
实现:任何需要 异步操作不可用,因为您需要 从函数返回以处理异步操作,但在 此时,
广播接收器
不再处于活动状态,因此 系统可以在异步操作之前终止其进程 完成

特别是,您可能不会显示对话框或绑定到来自的服务 在
广播接收机中
。对于前者,您应该使用
NotificationManager
API。对于后者,您可以使用
Context.startService()
向服务发送命令


你不能像你描述的那样做@Commonware是正确的,您选择的架构有缺陷

广播接收器
的寿命很短。因此,它们不能进行任何异步调用,也不能执行任何花费“大量时间”的任务。您的
BroadcastReceiver
由某个事件触发,如果您因该事件需要执行大量工作,则需要将该工作委托给
服务

通常(例如:在
活动中
),如果您想从
服务
请求信息,您可以绑定到
服务
并对该服务进行同步调用以请求所需的数据,也可以异步调用该服务(即:向其发送
意图
)然后收听返回的结果(使用
BroadcastReceiver
)。这两种方法都不适用于
BroadcastReceiver
,因为
BroadcastReceiver
不能绑定到
服务
,也不能进行异步调用

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

接收器生命周期

BroadcastReceiver
对象仅在呼叫期间有效 接收(上下文、意图)。一旦你的代码从这里返回 功能,系统认为对象已完成,不再 活跃的

这对你在工作中能做什么有着重要的影响
onReceive(上下文、意图)
实现:任何需要 异步操作不可用,因为您需要 从函数返回以处理异步操作,但在 此时,
广播接收器
不再处于活动状态,因此 系统可以在异步操作之前终止其进程 完成

特别是,您可能不会显示对话框或绑定到来自的服务 在
广播接收机中
。对于前者,您应该使用
NotificationManager
API。对于后者,您可以使用
Context.startService()
向服务发送命令

使用会话! 在会话中保存数据:

@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();
}
@覆盖
公共void onReceive(上下文、意图)
{
SessionManager会话=新的SessionManager(上下文);
//从会话获取用户数据
HashMap user=session.getUserDetails();
//名字
m_userId=(int)user.get(SessionManager.KEY_ID);
m_context=上下文;
PowerManager pm=(PowerManager)context.getSystemService(context.POWER\u服务);
PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,“”);
wl.acquire();
//把你的密码放在这里。
//Toast.makeText(上下文,“报警!!!!!!!”,Toast.LENGTH\u LONG.show();//例如
wl.释放();
}
使用会话! 在会话中保存数据:

@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();
}
@Overri