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