Android IntentService源码分析

题外话:我为什么特意写呢,是因为我OPPO面试时候问到了我intentservice有了解么,我当时回答了有初步了解就是service的进化版,然后内部实现了异步处理的方式,最后我们不用管他的生命周期,任务结束后就会自行停止service,然后他们问我源码时候我懵了,所以回去后研究了下就打算写出来

引言

Service服务是Android四大组件之一,在Android中有着举足重轻的作用。Service服务是工作的UI线程中,当你的应用需要下载一个文件或者播放音乐等长期处于后台工作而有没有UI界面的时候,你肯定要用到Service+Thread来实现。因此你需要自己在Service服务里面实现一个Thread工作线程来下载文件或者播放音乐。然而你每次都需要自己去写一个Service+Thread来处理长期处于后台而没有UI界面的任务,这样显得很麻烦,没必要每次都去构建一个Service+Thread框架处理长期处于后台的任务。Google工程师给我们构建了一个方便开发者使用的这么一个框架---IntentService。我这边一个项目是与硬件产品打交道的,需要打开很多串口U口通信,但是很多设备如果都是使用时候打开通道还是会出现打不开的情况,所以我会在app启动的时候利用intentservice打开全部设备,然后利用的是单例模式。

IntentService简介

IntentService是一个基础类,用于处理Intent类型的异步任务请求。当客户端调用android.content.Context#startService(Intent)发送请求时,Service服务被启动,且在其内部构建一个工作线程来处理Intent请求。当工作线程执行结束,Service服务会自动停止。IntentService是一个抽象类,用户必须实现一个子类去继承它,且必须实现IntentService里面的抽象方法onHandleIntent来处理异步任务请求。

使用方法

和正常Service一样这里就不讲述了

IntetService构造函数


由此看到构造函数只是传入String,用于定义线程的名称,然后看到一些成员变量可以看出IntentService其实只是封装了Handler的一个异步线程的Service,具体看下onCreate()

IntentService#onCreate方法


看到这里大家应该都知道了其内部使用的是HandlerThread 类创建了一个循环的工作线程thread,然后将工作线程中的Looper对象作为参数来创建ServiceHandler消息执行者。HandlerThread源码分析及使用HandlerThread+Handler构建成了一个带有消息循环机制的异步任务处理机制。因此开发者就可以将异步任务封装成消息的形式发送到工作线程中去执行了。Service服务生命周期第二步执行IntentService#onStartCommand方法。

IntentService#onStartCommand方法


代码很明确说到会调用onStart方法,然后onStart方法内部会利用mServiceHandler发送一个消息,这样我们回顾之前的代码可以看到


会调用onHandleIntent(msg.obj)方法,这个是抽象方法需要开发者实现,比如耗时的操作,最后调用stopSelf方法,然后在onDestroy方法,这个方法里面会调用mServiceLooper.quit();停止对消息的处理

IntentService总结

子类需继承IntentService并且实现里面的onHandlerIntent抽象方法来处理intent类型的任务请求。

子类需要重写默认的构造方法,且在构造方法中调用父类带参数的构造方法。

IntentService类内部利用HandlerThread+Handler构建了一个带有消息循环处理机制的后台工作线程,客户端只需调用Content#startService(Intent)将Intent任务请求放入后台工作队列中,且客户端无需关注服务是否结束,非常适合一次性的后台任务。比如浏览器下载文件,退出当前浏览器之后,下载任务依然存在后台,直到下载文件结束,服务自动销毁。

只要当前IntentService服务没有被销毁,客户端就可以同时投放多个Intent异步任务请求,IntentService服务端这边是顺序执行当前后台工作队列中的Intent请求的,也就是每一时刻只能执行一个Intent请求,直到该Intent处理结束才处理下一个Intent。因为IntentService类内部利用HandlerThread+Handler构建的是一个单线程来处理异步任务。

转载于废墟的树

你可能感兴趣的:(Android IntentService源码分析)