IntentService源码欣赏

移动开发 waitig 445℃ 百度已收录 0评论
    • IntentService源码欣赏
      • IntentService 总结

1. IntentService源码欣赏

  • 我们先来看源码吧
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);
        }
    }
    public IntentService(String name) {
        super();
        mName = name;
    }
    public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }
    @Override
    @Nullable
    public IBinder onBind(Intent intent) {
        return null;
    }
    @WorkerThread
    protected abstract void onHandleIntent(@Nullable Intent intent);
}

全部的源码都在这里,仅仅几十行而已,我们看看内部他都做了什么操作呢?
1. 构造函数,一个参数的构造如下

public IntentService(String name) {
        super();
        mName = name;
        //传入了一个名字,这个名字是在创建一个HandlerThread ,为该线程取名用的,至于HandlerThread 是个什么东西,我们现放在这里后面再讲
        /*new HandlerThread("IntentService[" + mName + "]");
        */
         }
  1. onCreatea() 方法
    我们看到onCreate 方法做了这么几件事情,创建了一个HandlerThread,同时根据HandlerThread获取到的Looper创建了ServiceHandler
@Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
  1. ServiceHandler
    上面我们看到在onCreate方法里面创建了一个ServiceHandler,那么这个又是一个什么呢,只是一个普通 的Handler类但是把handleMessage接受道的消息交给了抽象方法onHandleIntent(),也就是子类需要处理的事情.
 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);
        }
    }


@WorkerThread
 protected abstract void onHandleIntent(@Nullable Intent intent);
  1. 继续看onStart方法和onStartCommand
    在service创建之后会走到onStartCommand这里,这个方法里面调用了onStart方法,而onStart方法则是利用mServiceHandler发出了一条消息,回调给 onHandleIntent,看到这里我们明白了一样东西,也就是创建Service是时候,我们可以通过Intent来传递数据给Service,他们指点的传递正是通过 onHandleIntent方法
 @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

5.销毁
mServiceLooper.quit(); 这个是什么呢?
mServiceLooper = thread.getLooper(); mServiceLooper 是根据当HandlerThread的工作线程获取到的 一个 Looper对象,在销毁时停止

  @Override
    public void onDestroy() {
        mServiceLooper.quit(); 
    }

整个service的流程如上所讲几个小点,我们发现其实IntentService是一个用来处理异步任务并且处理完任务之后会自行退出的service(handleMessage 里面回调 onHandleIntent之后调用了 stopSelf(msg.arg1);)。

2. IntentService 总结

    • 它内部使用了HanderThread ,那么我们可以知道他是用来处理异步任务的service
    • 在处理完任务之后不同于普通的service的地方是,任务结束后自己停止,不需要手动停止
    • 如果我们多次启动服务会是什么情况呢?
      直接上吧:多次启动后不会创建多个service的实例,而是每次都会走 onStartCommand和onstart方法,因为内部是HandlerThread的缘故,多个任务不会同时执行,因为HandlerThread内部只有一个子线程,任务会排成队列逐个执行直到结束
    • 那么我们什么情况下会用到它呢?
      根据他的这样一个特点,我们确认,一般要一部执行,并且执行结束后自行结束的服务,比方说,我们下载apk,比方说我们安装apk,等等。

本文由【waitig】发表在等英博客
本文固定链接:IntentService源码欣赏
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)