在BroadCastReceiver的onReceive方法中执行耗时操作的正确姿势

经常听说在onReceive中执行耗时操作要开个Service,不要用子线程。

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

  不过其实如果你的任务时间不是非常长,内存又不是很紧张,其实开个线程还是OK的啦(而且花销也比Service小),随便开个十几分钟完全没压力的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值