我正在尝试在收到推送通知时更新UI的状态。为此,我需要启动执行某些网络操作的AsyncTask
,然后根据结果更新UI。
根据BroadcastReceiver
的文档,在接收器中执行异步操作是不安全的,因为执行它的进程可能会在onReceive()
返回时立即终止,假设其中没有其他“应用程序组件”那个过程。
BroadcastReceiver
是在自己的进程中运行,还是在与包含Activity的进程相同的进程中运行?因为只要有更新的UI我只关心任务的完成,所以如果活动关闭,我不担心AsyncTask
死亡。假设BroadcastReceiver与活动处于同一个进程中,这是否可以安全地启动我在接收器中描述的任务?
修改
为了澄清,我正在活动的onResume()
中注册接收者并取消注册onPause()
,因此它应该只在活动已经激活时接收意图。
答案 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。可能会有不露面的活动。