美文网首页
IntentService源码解析

IntentService源码解析

作者: 芸芸水中一滴水 | 来源:发表于2017-07-05 11:39 被阅读0次

概述

IntentService是Service的子类,通过实现onHandleIntent(Intent intent)抽象方法来执行耗时操作,耗时操作执行完成会自动停止当前Service;

构造方法

  1. IntentService(String name)
    name为线程名称,需要注意的是,继承IntentService类时子类的构造方法必须是空参数的,否则无法实例Service会报异常java.lang.InstantiationException;

内部类

    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);
        }
    }

Handler的子类,消息处理会交给IntentService的onHandleIntent(Intent intent)方法,消息处理完成会调用stopSelf(int startId)结束当前Service;

成员变量

  1. Looper mServiceLooper
    IntentService对应工作线程的Looper对象;
  2. ServiceHandler mServiceHandler
    IntentService对应工作线程的ServiceHandler对象;
  3. String mName
    线程名称;

成员方法

  1. onCreate()
    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

在服务onCreate时开启一个HandlerThread子线程,获取子线程Looper对象并创建ServiceHandler对象;

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

在服务onStart时给ServiceHandler发送消息,ServiceHandler会调用onHandleIntent(Intent intent)方法处理消息(一般是耗时操作)

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

在服务onDestroy时退出消息循环;

  1. onHandleIntent(Intent intent)
    在子类中实现该方法,用于执行耗时操作,其中intent参数由startService(intent)时传入在onStart(Intent intent, int startId)中接收。

实例

public class TestService extends IntentService {
    
    public static final String TAG = "Lee";

    public TestService() {
        super("test");
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d(TAG, "onHandleIntent, intent = " + intent);
        // 模拟耗时操作
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

相关文章

  • 组件之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给的介绍 作为服...

  • IntentService源码阅读

    IntentService源码阅读 作者:jianzi原文链接:IntentService源码阅读更新时间:201...

网友评论

      本文标题:IntentService源码解析

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