根据文档,甚至在调用goAsync
后,BroadcastReceiver
的onReceive
方法预计在10秒后完成,否则,系统可能会杀死该进程。
我已经在模拟器上为在后台运行的应用程序测试了它,无论是否使用goAsync
,后台线程都会在10秒左右被杀死。实际上两者都是几分钟。它在10秒后实际被杀的唯一情况是我将Intent.FLAG_RECEIVER_FOREGROUND
标志添加到触发广播的意图。
这是因为我的设备不受内存限制吗?
我想你误会了BR works。特别是这一部分至关重要
因此,您不应该从广播接收器开始长时间运行后台线程。在onReceive()之后,系统可以随时终止进程以回收内存,并且这样做会终止在进程中运行的生成线程。要避免这种情况,您应该调用goAsync()(如果您希望在后台线程中处理广播更多时间)或使用JobScheduler从接收器调度JobService,那么系统知道该进程继续执行活动工作。有关更多信息,请参阅进程和应用程序生命周期。
所以goAsync
的BroadcastReceiver
意味着延长BR的生命,而不是onReceive
本身 - onReceive
仍然在主线上运行并且ANR限制适用。但随着
根据参考文件,从onReceive
返回后,“正常BR”被认为是无用的:
goAsync()这可以由onReceive(Context,Intent)中的应用程序调用,以允许它在从该函数返回后保持广播活动。
使用goAsync
,您可以在“一段时间”开始一些后台作业/线程,因为它不是“正常的BR” - 它现在是“BR with goAsync”。
这是因为我的设备不受内存限制吗?
是的,我不相信模拟器。