IntentService 原理分析

一、前言

我们有时候会在service做一些耗时任务,需要自己创建子线程,那么有没有系统封装好的service,可以直接进行耗时任务呢,有的,那就是今天我们要说的IntentService 。ok,那我们下面就说一下它的使用,以及它的原理。

 

二、IntentService 的使用

IntentService 是抽象类,我们使用它是必须创建一个新类继承它。

public class MyIntentService extends IntentService {

    public MyIntentService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        //该方法就可以做耗时任务
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
}
Intent intent = new Intent(content, MyIntentService.class);
startService(intent);

就是这么简单,onHandleIntent中做耗时操作就行。

 

三、IntentService 源码分析

源码牵扯到HandlerThread,不会的可以看我另外一篇文章https://blog.csdn.net/qq_32650001/article/details/100015342

HandlerThread 原理分析

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);//回调onHandleIntent,这是在子线程哦
            //不懂看HandlerThread
            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 + "]");
        //创建HandlerThread
        thread.start();//开启

        mServiceLooper = thread.getLooper();//获取当前线程looper对象
        mServiceHandler = new ServiceHandler(mServiceLooper);//创建handler对象,绑定当前looper
    }

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

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);//每次都会调用onStart哦
        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);
}

首先启动Service,走onCreat方法,我们看到创建了一个HandlerThread对象,我们都知道HandlerThread继承了Thread,自带looper循环。ok,继续看同时创建了一个ServiceHandler (IntentService的内部类继承Handler)对象。这个时候我们start方法,我们看onStart方法中,我们用handler发送了消息。那么肯定会运行到handleMessage中,这个是在子线程中,为啥,去看HandlerThread。然后就回调到onHandleIntent中了,最后子线程运行完stopSelf(msg.arg1)结束。

四、总结

上面总结源码挺清楚的了,不懂请给我留言,谢谢拜~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值