IntentService

        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。

相关文章
相关标签/搜索