什么是IntentService?android
官方的解释是:
IntentService is a base class for
Services that handle asynchronous requests (expressed as
Intents) on demand. Clients send requests through
android.content.Context.startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement
onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
意思是说:IntentService是一个经过
Context.startService(Intent)启动能够处理异步请求的Service,使用时你只须要继承IntentService和重写其中的
onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会中止本身(通常在工做完成的时候). 全部的请求的处理都在一个工做线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次只能执行一个请求.(**本人修改了原文的一些翻译)
下面是要分析的源码:
public
abstract
class IntentService
extends Service {
private
volatile Looper mServiceLooper;
private
volatile ServiceHandler mServiceHandler;
private String mName;
private
boolean mRedelivery;
private
final
class ServiceHandler
extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public
void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
从源码能够分析出:
IntentService 其实是Looper,Handler,Service 的集合体,他不只有服务的功能,还有处理和循环消息的功能.
下面是onCreate()的源码:
@Override
public
void onCreate() {
super.onCreate();
HandlerThread thread =
new HandlerThread(
"IntentService[" + mName +
"]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler =
new ServiceHandler(mServiceLooper);
}
分析:IntentService建立时就会建立Handler线程(HandlerThread)而且启动,而后再获得当前线程的Looper对象来初始化IntentService的mServiceLooper,接着建立mServicehandler对象.
下面是onStart()的源码:
@Override
public
void onStart(Intent intent,
int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
分析:当你启动IntentService的时候,就会产生一条附带startId和Intent的Message并发送到MessageQueue中,接下来Looper发现MessageQueue中有Message的时候,就会中止Handler处理消息,接下来处理的代码以下:
@Override
public
void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
接着调用 onHandleIntent((Intent)msg.obj),这是一个抽象的方法,其实就是咱们要重写实现的方法,咱们能够在这个方法里面处理咱们的工做.当任务完成时就会调用stopSelf(msg.arg1)这个方法来结束指定的工做.
当全部的工做执行完后:就会执行onDestroy方法,源码以下:
@Override
public
void onDestroy() { mServiceLooper.quit(); }
服务结束后调用这个方法 mServiceLooper.quit()使looper停下来. 经过对源码的分析得出: 这是一个基于消息的服务,每次启动该服务并非立刻处理你的工做,而是首先会建立对应的Looper,Handler而且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有Message的时候接着获得Intent对象经过在onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会中止本身的服务.意思是Intent的生命周期跟你的处理的任务是一致的.因此这个类用下载任务中很是好,下载任务结束后服务自身就会结束退出