关于goAsync的困惑-BroadcastReceiver进程不会在10秒内被杀死

时间:2019-02-17 12:20:54

标签: android-intent broadcastreceiver intentfilter android-broadcast android-broadcastreceiver

根据文档,即使在调用goAsync之后,BroadcastReceiver的{​​{1}}方法也有望在10秒后完成,否则,系统可能会终止该过程。

我已经在模拟器上针对在后台运行的应用进行了测试,无论有没有onReceive,后台线程都不会在10秒左右被杀死。两者实际上最多要花几分钟。 唯一在10秒后被杀死的情况是,我将goAsync标志添加到触发广播的意图中。

这是因为我的设备不受内存限制吗?

1 个答案:

答案 0 :(得分:1)

我认为您误解了BR works的方式。尤其是这部分至关重要

  

由于这个原因,您不应该从广播接收器启动长时间运行的后台线程。在onReceive()之后,系统可以随时终止进程以回收内存,这样做可以终止在进程中运行的生成线程。为了避免这种情况,您应该调用goAsync()(如果您需要更多时间在后台线程中处理广播),或者使用JobScheduler从接收方安排JobService,以便系统知道该进程继续执行活动工作。有关更多信息,请参见流程和应用程序生命周期。

因此,goAsync中的BroadcastReceiver通常是为了延长BR的寿命,而不是延长onReceive本身-onReceive仍在主线程上运行并且ANR限制适用。但是使用

根据参考文档,从onReceive返回后,“普通BR”被认为是无用的:

  

goAsync()   可以由onReceive(Context,Intent)中的应用程序调用此方法,以使其从该函数返回后保持广播活动。

使用goAsync可以在“一段时间”内启动一些后台作业/线程,因为它不是“普通BR”-现在是“带goAsync的BR”。

  

这是因为我的设备不受内存限制吗?

是的,在那件事上我不相信模拟器。