IntentService 源码分析

概述

官方 IntentService 是一个通过 Context.startService(Intent) 启动可以处理异步请求的 Service ,使用时你只需要继承IntentService 和重写其中的 onHandleIntent(Intent) 方法接收一个 Intent 对象,在适当的时候会停止自己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次只能执行一个请求。

源码分析

ServiceHandler:

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) 这个方法来结束指定的工作。

结论

这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的 Looper,Handler 并且在 MessageQueue 中添加的附带客户 Intent 的 Message 对象,当 Looper 发现有Message的时候接着得到 Intent 对象通过在 onHandleIntent((Intent)msg.obj) 中调用你的处理程序.处理完后即会停止自己的服务.意思是 Intent 的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出。

你可能感兴趣的:(Android)