经常听说在onReceive中执行耗时操作要开个Service,不要用子线程。
原因嘛,BroadCastReceiver只在onReceive方法执行时是激活状态,只要onReceive一返回,它即为失活状态。Receiver进程是被一个激活状态的BroadCastReceiver所保护而不被系统终止的,一旦onReceive返回,Receiver进程变为一个空进程,空进程是可以在任意时刻被终止的。这就带来了一个问题:当响应一个广播信息的处理十分耗时的时候,那么就应该把这个处理放在一个单独的线程里去执行,来保证主线程里的其他用户交互组件能够继续运行,而一旦这么做,当onReceive()唤起一个线程后就会马上返回,这时就会把Receiver进程放到被终止的境地。BroadCastReceiver默认情况下是在主线程执行的,所以它所在的进程就是这个应用的进程,而当用户退出这个应用后,应用所在的进程如果不包含任何活动组件,当内存不够的时候,会被优先结束掉,所以导致其中的子线程无法完成自己执行的任务。解决这个问题的方案是在onReceive()里开始一个Service,让这个Service去做这件事情,那么系统就会认为这个进程里还有其他活动组件在运行。
不过其实如果你的任务时间不是非常长,内存又不是很紧张,其实开个线程还是OK的啦(而且花销也比Service小),随便开个十几分钟完全没压力的。