使用BroadcastReceiver启动AsyncTask

时间:2012-07-27 23:57:33

标签: android android-asynctask broadcastreceiver

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

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

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

修改

为了澄清,我正在活动的onResume()中注册接收者并取消注册onPause(),因此它应该只在活动已经激活时接收意图。

4 个答案:

答案 0 :(得分:6)

广播接收器没有在它自己的进程上运行,它在UI线程上运行。

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

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

答案 1 :(得分:1)

如果在AsyncTask内,您需要一个上下文,那么我认为服务更好。如果没有,使用AsyncTask没有问题。

答案 2 :(得分:1)

在Honeycomb之前(API11),您必须使用服务。

自Honeycomb(API11)以来,您可以使用goAsync()

  

这可以由onReceive(Context,Intent)中的应用程序调用   允许它在返回后保持广播活动   功能。这并没有改变相对的期望   响应广播(在10秒内完成),但确实允许   将与之相关的工作移动到另一个线程的实现   避免因磁盘IO而导致主UI线程出现故障。

答案 3 :(得分:0)

我建议您从广播接收器startActivity(intent)做什么。就这样。在意图内部,我将提供您所说的事件信息,您只需在捆绑中设置参数即可。然后,您可以在活动onStart()onCreate()内查看此内容。如果该标志在那里,那么从Activity启动AsyncTask

根本不需要使用服务,具有服务活动的所有绑定和通信限制。

请记住,您也可以startActivityForResult()。我认为除了在广播接收器内传递和转发之外,你不想做任何事情。

顺便说一句,活动不需要有UI。可能会有不露面的活动。