【问题标题】:Confusion about goAsync - BroadcastReceiver process is not killed anywhere near 10 seconds关于 goAsync 的困惑-BroadcastReceiver 进程在 10 秒内不会被杀死
【发布时间】:2019-02-17 12:20:53
【问题描述】:
根据文档,即使在调用goAsync 之后,BroadcastReceiver 的onReceive 方法预计也会在 10 秒后完成,否则系统可能会终止进程。
我已经在模拟器上为在后台运行的应用程序进行了测试,无论有没有goAsync,后台线程都会在接近 10 秒的时间内被杀死。两者实际上都长达几分钟。
10 秒后它实际上被杀死的唯一情况是我将 Intent.FLAG_RECEIVER_FOREGROUND 标志添加到触发广播的意图中。
这是因为我的设备不受内存限制吗?
【问题讨论】:
标签:
android-intent
broadcastreceiver
intentfilter
android-broadcast
android-broadcastreceiver
【解决方案1】:
我想你误解了BR works。尤其是这部分很关键
因此,您不应从广播接收器启动长时间运行的后台线程。在 onReceive() 之后,系统可以随时终止进程以回收内存,并在此过程中终止进程中运行的衍生线程。为避免这种情况,您应该调用 goAsync()(如果您想要更多时间在后台线程中处理广播)或使用 JobScheduler 从接收器调度 JobService,以便系统知道该进程继续执行活动工作。有关详细信息,请参阅流程和应用程序生命周期。
所以BroadcastReceiver 中的goAsync 通常是为了延长BR 的寿命,而不是onReceive 本身-onReceive 仍然在主线程上运行并且ANR 限制适用。但是随着
“Normal BR”在从onReceive返回后被认为是无用的,根据参考文档:
goAsync()
这可以由 onReceive(Context, Intent) 中的应用程序调用,以允许它在从该函数返回后保持广播活动。
使用goAsync,您可以在“一段时间”内启动一些后台作业/线程,因为它不是“正常的 BR” - 现在是“带有 goAsync 的 BR”。
这是因为我的设备不受内存限制吗?
是的,在这件事上我不会相信模拟器。