在我之前的问题中:如何在 BroadcastReceiver 中保存和访问数据?我有很好的答案,但在这里我专注于这个。
有广播接收器和服务。我想从接收器发送一些数据到服务并取回数据。发起传输的一方是接收方,而不是服务方。
为简单起见,假设接收者等待 SCREEN_ON,然后询问服务“这是用户的生日吗”,服务器返回 true 或 false。
如果我没记错的话,我应该将发送到服务的数据附加到 Intent,然后调用startService
,但是如何取回数据?
在我之前的问题中:如何在 BroadcastReceiver 中保存和访问数据?我有很好的答案,但在这里我专注于这个。
有广播接收器和服务。我想从接收器发送一些数据到服务并取回数据。发起传输的一方是接收方,而不是服务方。
为简单起见,假设接收者等待 SCREEN_ON,然后询问服务“这是用户的生日吗”,服务器返回 true 或 false。
如果我没记错的话,我应该将发送到服务的数据附加到 Intent,然后调用startService
,但是如何取回数据?
您不能按照您所描述的方式真正做到这一点。@CommonsWare 是正确的,您选择的架构有缺陷。
BroadcastReceiver
s 是短暂的。因此,它们不能进行任何异步调用,也不能执行任何需要“大量时间”的任务。您BroadcastReceiver
会被某个事件触发,如果由于该事件您需要做大量工作,您需要将该工作委托给Service
.
通常(例如:在 a 中Activity
),如果您想从 a 请求信息,Service
您可以绑定到Service
并同步调用服务以请求您想要的数据,或者您可以异步调用服务(即:发送Intent
到它),然后监听返回的结果(使用 a BroadcastReceiver
)。这些方法都不能从 a 工作,BroadcastReceiver
因为 aBroadcastReceiver
不能绑定到 aService
并且它不能进行异步调用。
编辑:从Android 文档中复制相关信息以供参考
接收器生命周期
BroadcastReceiver
对象仅在调用期间有效onReceive(Context, Intent)
。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。这对您在实现中可以执行的操作有重要影响
onReceive(Context, Intent)
:任何需要异步操作的东西都不可用,因为您需要从函数返回来处理异步操作,但此时BroadcastReceiver
不再活动,因此系统在异步操作完成之前可以自由地终止其进程。特别是,您可能不会显示对话框或从
BroadcastReceiver
. 对于前者,您应该改用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();
}