5

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

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

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

编辑:

为了澄清,我在活动中注册接收器onResume()并取消注册它onPause(),所以它应该只在活动已经处于活动状态时接收意图。

4

4 回答 4

6

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

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

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

于 2012-07-28T02:23:19.137 回答
1

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

于 2012-07-28T16:11:42.637 回答
1

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

由于 Honeycomb (API11),您可以使用goAsync()

这可以由 onReceive(Context, Intent) 中的应用程序调用,以允许它在从该函数返回后保持广播活动。这不会改变对广播相对响应的期望(在 10 秒内完成),但允许实现将与其相关的工作转移到另一个线程,以避免由于磁盘 IO 导致主 UI 线程出现故障。

于 2014-03-16T07:40:04.960 回答
0

我建议做的是startActivity(intent)来自广播接收器。就这样。在我将提供您所说的事件信息的意图中,您只需在包中设置一个参数。然后,您可以在 ActivityonStart()onCreate()任何被调用的地方检查它。如果旗帜在那里,那么从Activity开球开始AsyncTask

完全不需要使用服务,具有来自服务活动的所有绑定和通信限制。

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

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

于 2012-07-28T03:09:00.050 回答