关于goAsync的困惑 - 在10秒内任何地方都不会杀死BroadcastReceiver进程

问题描述 投票:0回答:1

根据文档,甚至在调用goAsync后,BroadcastReceiveronReceive方法预计在10秒后完成,否则,系统可能会杀死该进程。

我已经在模拟器上为在后台运行的应用程序测试了它,无论是否使用goAsync,后台线程都会在10秒左右被杀死。实际上两者都是几分钟。它在10秒后实际被杀的唯一情况是我将Intent.FLAG_RECEIVER_FOREGROUND标志添加到触发广播的意图。

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

android-intent broadcastreceiver intentfilter android-broadcast android-broadcastreceiver
1个回答
1
投票

我想你误会了BR works。特别是这一部分至关重要

因此,您不应该从广播接收器开始长时间运行后台线程。在onReceive()之后,系统可以随时终止进程以回收内存,并且这样做会终止在进程中运行的生成线程。要避免这种情况,您应该调用goAsync()(如果您希望在后台线程中处理广播更多时间)或使用JobScheduler从接收器调度JobService,那么系统知道该进程继续执行活动工作。有关更多信息,请参阅进程和应用程序生命周期。

所以goAsyncBroadcastReceiver意味着延长BR的生命,而不是onReceive本身 - onReceive仍然在主线上运行并且ANR限制适用。但随着

根据参考文件,从onReceive返回后,“正常BR”被认为是无用的:

goAsync()这可以由onReceive(Context,Intent)中的应用程序调用,以允许它在从该函数返回后保持广播活动。

使用goAsync,您可以在“一段时间”开始一些后台作业/线程,因为它不是“正常的BR” - 它现在是“BR with goAsync”。

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

是的,我不相信模拟器。

© www.soinside.com 2019 - 2024. All rights reserved.