Android源码系列(14) -- IntentService

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

内容简介: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);

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

查看所有标签

猜你喜欢:

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

Building Websites with Joomla!

Building Websites with Joomla!

H Graf / Packt Publishing / 2006-01-20 / USD 44.99

This book is a fast paced tutorial to creating a website using Joomla!. If you've never used Joomla!, or even any web content management system before, then this book will walk you through each step i......一起来看看 《Building Websites with Joomla!》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具