内容简介:IntentService是用于异步处理这种 “工作队列处理器” 模式主要适用于从应用主线程转移任务。所有工作仅由一个工作线程处理,每次处理一个任务,且不会阻塞主线程。
一、类签名
IntentService是用于异步处理 Intent 的 Service 抽象子类。客户端通过 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;
三、内部类
绑定到 Looper 的 Handler 是一个静态内部类。 轮到对应 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; }
五、成员方法
若 enabled 为 true , onStartCommand(Intent, int, int) 返回 Service.START_REDELIVER_INTENT 。当 onHandleIntent(Intent) 执行结束前服务死亡,服务会重启并重分发最近那个intent。 若 enabled 为 false ,服务死亡时所有Intent一并销毁。
public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; }
创建 HandlerThread 和 ServiceHandler 。
@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; }
此方法封装目标 Intent 为 Message ,送入 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);
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【源码阅读】AndPermission源码阅读
- ReactNative源码解析-初识源码
- 【源码阅读】Gson源码阅读
- Spring源码系列:BeanDefinition源码解析
- istio 源码 – Citadel 源码分析 (原创)
- istio 源码 – pilot 源码分析(原创)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Android编程权威指南(第2版)
Bill Phillips、Chris Stewart、Brian Hardy、Kristin Marsicano / 王明发 / 人民邮电出版社 / 2016-5 / 109.00 元
Big Nerd Ranch是美国一家专业的移动开发技术培训机构。本书主要以其Android训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android编程权威指南。全书共34章,详细介绍了8个Android 应用。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得最前沿的开发经验。 如果你熟悉Java语言,或者了解面向对象编程,那就立刻开始And......一起来看看 《Android编程权威指南(第2版)》 这本书的介绍吧!