Android 使用BroadcastReceiver启动异步任务

Android 使用BroadcastReceiver启动异步任务,android,android-asynctask,broadcastreceiver,Android,Android Asynctask,Broadcastreceiver,我正在尝试在收到推送通知时更新UI的状态。为此,我需要启动一个执行一些网络操作的AsyncTask,然后根据结果更新UI 根据BroadcastReceiver的文档,在接收器内执行异步操作是不安全的,因为执行异步操作的进程可能会在onReceive()返回时立即终止,前提是该进程中没有其他“应用程序组件” BroadcastReceiver是在自己的进程中运行,还是在与包含活动相同的进程中运行?因为我只关心任务的完成,只要有一个UI要更新,所以我不担心活动关闭时AsyncTask会死掉。假设B

我正在尝试在收到推送通知时更新UI的状态。为此,我需要启动一个执行一些网络操作的
AsyncTask
,然后根据结果更新UI

根据
BroadcastReceiver
的文档,在接收器内执行异步操作是不安全的,因为执行异步操作的进程可能会在
onReceive()
返回时立即终止,前提是该进程中没有其他“应用程序组件”

BroadcastReceiver
是在自己的进程中运行,还是在与包含活动相同的进程中运行?因为我只关心任务的完成,只要有一个UI要更新,所以我不担心活动关闭时
AsyncTask
会死掉。假设BroadcastReceiver与活动处于相同的过程中,这是否可以/安全地从接收器中启动我描述的任务

编辑:


为了澄清,我正在活动的
onResume()
中注册接收器,并将其注销
onPause()
,因此它应该只在活动已处于活动状态时接收意图。

广播接收器不是在其自己的进程上运行,而是在UI线程上运行

只有在应用程序中没有其他活动或服务正在运行时,onReceive方法返回后,才会终止进程


如果您的广播接收器是内部类的实例,并且仅在活动处于活动状态时接收,那么在onReceive方法返回后,您的进程将不会被终止。

我建议您从广播接收器执行
startActivity(intent)
。就这些。在我将提供您所说的事件信息的意图中,您可以在bundle中设置一个参数。然后,您可以在活动
onStart()
onCreate()
中检查这一点。如果有标志,则从
活动
启动
异步任务

完全不需要使用服务,因为服务活动具有所有绑定和通信限制

请记住,您也可以
startActivityForResult()
。我认为你除了在广播接收机中传递和转发外,什么都不想做


顺便说一句,活动不需要有UI。可以有匿名活动。

如果在
异步任务中需要上下文,那么我认为服务更好。如果没有,则使用
AsyncTask

在蜂窝(API11)之前,您必须使用服务

由于蜂巢(API11),您可以使用:

这可以由onReceive(上下文、意图)中的应用程序调用,以 允许它在从该位置返回后保持广播活动 功能。这并没有改变相对稳定的预期 响应广播(在10秒内完成),但允许 将与之相关的工作转移到另一个线程的实现 避免由于磁盘IO导致主UI线程出现故障


如果广播接收器不安全,为什么不使用
服务
?它将完成同样的事情,但没有你所说的问题。@Andy我知道使用
服务在任何情况下都是安全的,但我试图确定在这种特殊情况下它是否真的是必要的。如果你考虑一下的话。服务非常适合运行异步操作。因此,为什么不存在相同的限制。广播接收器主要用于其他事情,如系统中发生的事情,而不是通过网络更新数据。因此,“广播”。虽然
服务
就是它,但您运行的服务是用户不需要知道的。希望这是有意义的。您可以使用处理程序从您的广播接收器更新您的UI。这样,您就可以在activities msg队列中对事件进行排队。我建议您立即将信息传递给Activity,如下所述。从那里你可以开始你需要的任何东西。正如你提到的-…活动不需要UI的-然后我建议他使用服务…我认为活动用于UI,服务用于后台任务。