IntentService是一种用于处理异步请求(表现为Intent)的服务基类。客户经过调用Context.startService(Intent)发送请求;根据须要启动服务,依次使用工做者线程处理每个Intent,而且在工做完成后终止自身。 java
这种“工做队列处理器”模式一般被用来从一个应用程序的主线程卸载任务。IntentService类的存在是为了简化这种模式,而且照顾了技术性的部分。要使用它,须要继承IntentService类而且实现onHandleIntent(Intent)方法。IntentService将会接收到这些Intent,运行一条工做者线程,而且在适当的时候中止服务。 异步
全部的请求都是在一个单一的工做者线程中处理的,尽管处理过程可能须要很长时间(不会阻塞应用程序的主线程),可是每次只能有一个请求会被处理。 ide
首先,看它提供的一个构造方法: oop
public IntentService(String name) { super(); mName = name; }
参数name被用于命名即将用到的工做者线程,它的重要性仅用于调试。这里须要注意的一点是,Service的实例化是系统来完成的,而且系统是用无参的构造方法来实例化Service的。因此,你的子类必须是无参的,而后在无参构造方法里调用super("name")。 线程
再看onCreate方法: 调试
@Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); }
其中的ServiceHandler是IntentService类的内部类: code
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); } }
在onCreate方法里,建立并启动了一条工做线程。而后使用工做线程的Looper构造了一个Handler,这个Handler将循环处理请求。 继承
根据Service的生命周期,咱们再看onStartCommand方法: 生命周期
@Override public int onStartCommand(Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; }
后面的返回值,能够看看Service类的相关内容。onStartCommand方法调用了onStart方法。再跟到onStart方法: 队列
@Override public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }
每次调用Context.startService(Intent intent),都会将一个请求(Message,包含一个Intent,并有一个id)添加到消息队列(工做线程的循环队列,相关内容能够看Handler源码)。处理完全部请求后,就会中止服务。
对于onHandleIntent(Intent intent)方法,官方注释是这样说的:
这个方法运行在工做线程,用于处理一个请求。同一时间只有一个Intent被处理,可是处理过程发生在一个独立于其它应用逻辑的工做线程。所以,若是这个代码块要执行很长时间,它将阻塞其它在同一个IntentService上的请求,除此以外,它不会阻塞其它任何东西。
另外,IntentService实现了一个默认的onBind方法,默认返回null。