美文网首页
组件之IntentService源码解析

组件之IntentService源码解析

作者: kjy_112233 | 来源:发表于2018-10-08 14:27 被阅读0次

一、IntentService源码解析

(1)IntentService源码

    //该构造方法需在子类中调用,用于创建一个IntentService对象。
    public IntentService(String name) {
        super();
        //用于定义工作线程的名称,仅仅用于调式作用。
        mName = name;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //创建了一个循环的工作线程thread
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        //将工作线程中的Looper对象作为参数来创建ServiceHandler消息执行者
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    //在IntentService子类中你无需重写该方法。你需要重写onHandlerIntent方法,系统会在IntentService接受一个请求开始调用该方法
    @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 onStart(@Nullable Intent intent, int startId) {
        //获得一个消息对象msg
        Message msg = mServiceHandler.obtainMessage();
        //将startId作为该消息的消息码。
        msg.arg1 = startId;
        //将异步任务请求intent作为消息内容封装成一个消息msg
        msg.obj = intent;
        //发送到mServiceHandler消息执行者中去处理
        mServiceHandler.sendMessage(msg);
    }

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            //处理异步任务intent的请求
            onHandleIntent((Intent)msg.obj);
            //自动结束IntentService服务
            stopSelf(msg.arg1);
        }
    }

    //该方法用于处理intent异步任务请求,在工作线程中调用该方法。
    protected abstract void onHandleIntent(@Nullable Intent intent);

    @Override
    public void onDestroy() {
        //让当前工作线程HandlerThread退出当前Looper循环,进而结束线程
        mServiceLooper.quit();
    }

每一个时刻只能处理一个intent请求,当同时又多个intent请求时,也就是客户端同时多次调用startService方法启动同一个服务时,其他的intent请求会暂时被挂起,直到前面的intent异步任务请求处理完成才会处理下一个intent请求。直到所有的intent请求结束之后,IntentService服务会调用stopSelf停止当前服务。也就是当intent异步任务处理结束之后,对应的IntentService服务会自动销毁,进而调用onDestroy方法。

总结

  • 子类需继承IntentService并且实现里面的onHandlerIntent抽象方法来处理intent类型的任务请求。
  • 子类需要重写默认的构造方法,且在构造方法中调用父类带参数的构造方法。
  • IntentService类内部利用HandlerThread+Handler构建了一个带有消息循环处理机制的后台工作线程,客户端只需调用startService(Intent)将Intent任务请求放入后台工作队列中,且客户端无需关注服务是否结束,非常适合一次性的后台任务。

相关文章

  • 组件之IntentService源码解析

    一、IntentService源码解析 (1)IntentService源码 每一个时刻只能处理一个intent请...

  • IntentService 源码解析

    Android系统中的Service一般是在后台长时间运行的,有时候我们需要一种轻量级的Service在后台运行结...

  • IntentService源码解析

    由于IntentService的源码涉及到了Handler、Looper、MessageQueue等知识点,所以如...

  • IntentService源码解析

    上一篇我们分析了Android中的线程间通信HandlerThread的原理.HandlerThread充分的利用...

  • IntentService源码解析

    前几篇文章带领大家对HandlerThread的用法及原理进行了深入探索,为了巩固大家对HandlerThread...

  • IntentService源码解析

    为什么我们需要IntentService ? Android中的IntentService是继承自Service类...

  • IntentService源码解析

    概述 IntentService是Service的子类,通过实现onHandleIntent(Intent int...

  • IntentService源码解析

    上套路,说废话。IntentService是个Service的管理器,源码也不是很难,帮助我们简化任务创建。当然在...

  • IntentService源码解析

    如果此时你对Service有些模糊可先简单浏览一下Andriod中各种服务 首先看一下Google给的介绍 作为服...

  • Android源码解析之IntentService(四)

    前言 上一章我们介绍了HandlerThread组件可以使得子线程可以发消息给主线程,甚至线程之间也可以通信。那么...

网友评论

      本文标题:组件之IntentService源码解析

      本文链接:https://www.haomeiwen.com/subject/pxbdaftx.html