2012-07-27 73 views
5

我试图在收到推送通知时更新UI的状态。为了做到这一点,我需要启动一个AsyncTask来执行一些网络操作,然后根据结果更新UI。使用BroadcastReceiver启动AsyncTask

根据文档对BroadcastReceiver,接收机内执行异步操作是不安全的,因为它执行的处理可以被立即返回onReceive()杀死,假设有在该过程中没有其他“应用程序组件”。

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

编辑:

要澄清,我注册在活动的onResume()接收器和注销其onPause(),所以它应该只接受意图时,活动已经激活。

+0

如果不安全,为什么不使用“服务”而不是BroadcastReceiver?它会完成同样的事情,但没有你提到的问题。 – Andy 2012-07-28 00:34:39

+0

@我知道在任何情况下使用“服务”都是安全的,但我试图确定在这种情况下是否真的有必要。 – jnackman 2012-07-28 00:39:48

+1

好吧,如果你考虑一下。服务非常适合运行异步操作。因此,为什么同样的限制不存在。 BroadcastReceivers主要用于其他事情,比如系统发生什么事情,而不是通过网络更新数据。因此“广播”。虽然“服务”就是这样,但您正在运行的服务用户不需要知道。希望这是有道理的。 – Andy 2012-07-28 00:43:39

回答

5

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

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

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

+0

[链接到官方文档](http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle) – renadeen 2014-06-05 12:41:37

0

我建议做的是从广播接收器中的startActivity(intent)。就这样。在意图中,我会提供您所说的事件信息,您可以在包中设置一个参数。然后,您可以在活动onStart()onCreate()中查看这个内容,无论哪个被调用。如果旗帜在那里,那么从Activity开始AsyncTask

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

还记得你也可以startActivityForResult()以及。我认为你不想做任何事情,除了在广播接收器中传递和转发。

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

+0

正如你所说 - _ ...活动不需要UI's_ - 然后我推荐他使用服务......我认为活动是用于UI和后台任务的服务。 – 2012-07-28 16:05:43

1

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

1

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

由于蜂窝(API11),你可以使用goAsync()

这可以通过一个应用程序中的onReceive(上下文,意图)被调用来 允许它保持广播主动从 函数返回后。这并不会改变对广播的响应(在10秒内完成它)的相对 的期望,但确实允许 实现将与其相关的工作转移到另一线程 以避免由于磁盘IO而干扰主UI线程。

相关问题