IntentService源码解析

IntentService源码解析
一、IntentService特点
IntentService是Android中专门用于处理异步任务的服务组件,我们知道,在Android开发中,可以通过Service来实现异步耗时任务的处理,但这需要在Service中创建工作线程,并将耗时任务在工作线程中执行,因为Service中执行的所有操作,默认都是在主线程中进行的。而IntentService内部则是专门提供了一个用于处理耗时任务的工作线程,它继承自Service,并且在其内部也维护了对异步任务请求的轮询器Looper,以及以消息机制的形式执行异步耗时任务的Handler。结合分析的HandlerThread源代码可以看出,IntentService实际上就相当于对HandlerThread进行了一层封装,并确保耗时任务的执行,是通过后台服务Service来完成的。
IntentService还有一个特点就是当耗时任务执行完成后,它会自动停止,而不需要我们手动去停止。当需要执行多个异步耗时任务时,IntentService会被启动多次,并且耗时任务会被排队等待,执行完第一个再去执行第二个,当所有的耗时任务都执行完成,IntentService将会自动停止。接下来通过分析IntentService的源码,对其进行更详细的理解。
二、IntentService源码解析
通过查看IntentService源代码,可以首先看出,IntentService它本身是一个抽象类,这就需要在使用它的时候,手动重写IntentService的构造方法,并为其指定一个名称。
这里写图片描述
由于IntentService是通过继承Service组件实现的,因此,IntentService将会拥有与Service组件相同的生命周期方法。所以,接下来我们先首先查看IntentService在第一次创建时所执行的操作。
IntentService在第一次创建时,将会执行生命周期方法onCreate。通过阅读这段源码可以看出,在IntentService创建时,创建了HandlerThread,并将其启动,接下来又创建了一个Handler,这个Handler为ServiceHandler,它使用了HandlerThread中的轮询器Looper。
这里写图片描述
因此,通过分析IntentService的在第一次创建时的这段源码可以看出,它内部开启了一个带有轮询器Looper的线程,同时还拥有一个可以用于执行异步耗时任务的Handler,这样一来,IntentService就可以通过异步消息的形式,通过轮询的方式来执行异步耗时任务。需要注意的是,由于ServiceHandler绑定的轮询器Looper为HandlerThread中的Looper,而HandlerThread中的Looper又是子线程中的轮询器。因此,ServiceHandler中的轮询器Looper也是子线程中的,消息队列MessageQueue也是子线程HandlerThread中的消息队列。所以,ServiceHandler中的handleMessage方法中执行的操作,均在后台工作线程中执行的,也就是说,handleMessage方法中执行的操作,不是运行在主线程上的。
IntentService又是如何处理并执行异步耗时任务的呢,接下来我们分析IntentService中的onStartCommand方法。
外部传递过来的异步任务,可以通过startService方式启动IntentService,这时,IntentService中的onStartCommand方法就会被执行,而在执行该方法时,又会执行onStart方法,代码如下所示。
这里写图片描述
IntentService执行onStart方法时,构建了Message,然后将外部调用方传递的Intent,添加到了Message中,最后通过在onCreate方法中创建的serviceHandler,将这条消息发送出去,代码如下所示。消息最终会被IntentService中的ServiceHandler接收并处理,其原因在于ServiceHandler中持有HandlerThread中的Looper对象和消息队列。
这里写图片描述
这时,IntentService的ServiceHandler类中的handleMessage方法将会被执行。由于前面说过,该方法是在后台工作线程中执行的。因此,handleMessage方法将会开始处理异步耗时任务。
处理异步任务时,将会执行onHandleIntent方法,接下来会执行stopSelf方法,代码如下所示。
这里写图片描述
onHandleIntent方法是一个抽象方法,该方法需要由子类去实现,而处理异步耗时操作,最终就是需要将耗时操作写在这里。这也是使用IntentService时,子类必须重写的方法之一,通过重写该方法,就可以在这里进行耗时任务的处理。
这里写图片描述
当ServiceHandler执行完onHandleIntent方法后,就会执行stopSelf方法,通过阅读源代码可以看出,调用该方法时,传递了参数。在Android的服务组件Service中,stopSelf共有两个方法,一种是接收参数,另一种是不需要传递参数。这两种方法的本质区别是,如果传递了参数,IntentService就会将子线程消息队列中的所有消息都处理完成后,才会销毁这个服务;如果没有传递参数,则会直接终止服务,这时如果子线程消息队列中存在待处理的消息,则不会被处理了。
因此,IntentService处理异步耗时任务时,如果同时向IntentService提交了多个耗时任务,那么,这些耗时任务将会在消息队列中进行排队,并被依次处理。当消息队列中没有需要处理的耗时异步任务时,IntentService就会立即被销毁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值