Android源码系列(14) -- IntentService

栏目: IOS · Android · 发布时间: 5年前

内容简介:IntentService是用于异步处理这种 “工作队列处理器” 模式主要适用于从应用主线程转移任务。所有工作仅由一个工作线程处理,每次处理一个任务,且不会阻塞主线程。

一、类签名

IntentService是用于异步处理 IntentService 抽象子类。客户端通过 startService(Intent) 发送请求,服务根据需要启动,轮流处理工作线程内 Intent ,所有任务处理完后服务自行结束。

这种 “工作队列处理器” 模式主要适用于从应用主线程转移任务。 IntentService 是简化这种模式和关注处理者的类,只需继承此类并实现 onHandleIntent(Intent)IntentService 会接收Intent,启动工作线程进行处理,并在适当时候关闭Service(没有任务时)。

所有工作仅由一个工作线程处理,每次处理一个任务,且不会阻塞主线程。

public abstract class IntentService extends Service

源码来自Android 28

二、数据成员

// 线程包含的Looper
private volatile Looper mServiceLooper;

// 使用Looper的Handler
private volatile ServiceHandler mServiceHandler;

// 工作线程名称
private String mName;

// 重分发标志位
private boolean mRedelivery;

三、内部类

绑定到 LooperHandler 是一个静态内部类。 轮到对应 Intent 处理时,实例送到 handleMessage(Message msg) 并调用 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);
    }
}

四、构造方法

创建 IntentService 实例,由子类构造方法调用

// @param name 为工作线程指定名称,主要方便Debug
public IntentService(String name) {
    super();
    mName = name;
}

五、成员方法

enabledtrueonStartCommand(Intent, int, int) 返回 Service.START_REDELIVER_INTENT 。当 onHandleIntent(Intent) 执行结束前服务死亡,服务会重启并重分发最近那个intent。 若 enabledfalse ,服务死亡时所有Intent一并销毁。

public void setIntentRedelivery(boolean enabled) {
    mRedelivery = enabled;
}

创建 HandlerThreadServiceHandler

@Override
public void onCreate() {
    super.onCreate();
    
    // 创建并启动HandlerThread,实例内部启动Looper
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    // 从HandlerThread获取Looper
    mServiceLooper = thread.getLooper();
    // 从Looper构建Handler
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

Service被 startService() 触发时回调 onStartCommand() 调用 onStart() 。不应重写此方法,如有必要请重写 onHandleIntent

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

此方法封装目标 IntentMessage ,送入 Handler 的消息队列等待分发,处理顺序是FIFO。

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

Service 销毁时调用 Looper.quit() ,此方法内部调用 MessageQueue.quit(false) 关闭消息队列。

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

onBind(Intent intent)默认返回null。若需支持 bindService() 需重写。

@Override
@Nullable
public IBinder onBind(Intent intent) {
    return null;
}

工作线程分派任务时调用此方法,需在子类实现。每次只有一个 Intent 执行,但执行独立于其他应用逻辑的工作线程。运行需较长时间会阻塞相同 IntentService 中的其他请求,不会阻塞其他东西。

所有请求成功处理后 IntentService 自动停止运行,开发者不需要调用 stopSelf 方法。

// @param intent 传递给Context#startService(Intent)的实例
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

码出高效:Java开发手册

码出高效:Java开发手册

杨冠宝、高海慧 / 电子工业出版社 / 2018-10 / 99.00元

《码出高效:Java 开发手册》源于影响了全球250万名开发工程师的《阿里巴巴Java开发手册》,作者静心沉淀,对Java规约的来龙去脉进行了全面而彻底的内容梳理。《码出高效:Java 开发手册》以实战为中心,以新颖的角度全面阐述面向对象理论,逐步深入地探索怎样成为一位优秀开发工程师。比如:如何驾轻就熟地使用各类集合框架;如何得心应手地处理高并发多线程问题;如何顺其自然地写出可读性强、可维护性好的......一起来看看 《码出高效:Java开发手册》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具