为什么不建议在广播中启动一个线程做任务

首先需要知道:
1,这里所说的广播是静态广播
2,广播是运行在ui线程,阻塞15s会ANR
3,当android程序第一次运行时会启动一个进程和一个ui线程(不考虑多进程,多线程等)

一个未运行的程序接受到一个广播后的流程:

1,启动程序进程
2,启动ui线程和调用广播的 onReceive(Context context, Intent intent)方法
3,onReceive方法返回后,进程和线程处于等待状态;系统任意时刻可以终止和回收该线程和进程占有资源(内存)

如果:在onReceive开启一个线程做任务,任务未做完系统有可能回收进程,做任务的线程就没有对应的进程上下文,会被回收,任务就有可能未完成。

所以建议在onReceive中启动一个服务(再在服务中开线程做任务)做长时间任务。这样程序进程为后台进程(没有使用startForeground)系统就不会任意时刻回收此进程

猜你喜欢

转载自blog.csdn.net/kingyc123456789/article/details/53818606
今日推荐