根据文档,即使在调用goAsync
之后,BroadcastReceiver
的{{1}}方法也有望在10秒后完成,否则,系统可能会终止该过程。
我已经在模拟器上针对在后台运行的应用进行了测试,无论有没有onReceive
,后台线程都不会在10秒左右被杀死。两者实际上最多要花几分钟。
唯一在10秒后被杀死的情况是,我将goAsync
标志添加到触发广播的意图中。
这是因为我的设备不受内存限制吗?
答案 0 :(得分:1)
我认为您误解了BR works的方式。尤其是这部分至关重要
由于这个原因,您不应该从广播接收器启动长时间运行的后台线程。在onReceive()之后,系统可以随时终止进程以回收内存,这样做可以终止在进程中运行的生成线程。为了避免这种情况,您应该调用goAsync()(如果您需要更多时间在后台线程中处理广播),或者使用JobScheduler从接收方安排JobService,以便系统知道该进程继续执行活动工作。有关更多信息,请参见流程和应用程序生命周期。
因此,goAsync
中的BroadcastReceiver
通常是为了延长BR的寿命,而不是延长onReceive
本身-onReceive
仍在主线程上运行并且ANR限制适用。但是使用
根据参考文档,从onReceive
返回后,“普通BR”被认为是无用的:
goAsync() 可以由onReceive(Context,Intent)中的应用程序调用此方法,以使其从该函数返回后保持广播活动。
使用goAsync
可以在“一段时间”内启动一些后台作业/线程,因为它不是“普通BR”-现在是“带goAsync的BR”。
这是因为我的设备不受内存限制吗?
是的,在那件事上我不相信模拟器。