原文地址IntentService源码分析

@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}

源码可知:

1)实际上是使用了一个 HandlerThread 来维护线程的,

2) HandleThread 中,内部已经维护一个 Looper,这里直接使用 HandlerThread 的 Looper 对象,便于在 IntentService 中去维护消息队列,

3)创建的 mServiceHandler 是属于 HandleThread 这个 WorkerThread 的。

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

源码可知:

1)直接把消息交给 onHandleIntent() 方法去执行具体的业务逻辑

2)执行完成之后,立即调用 stopSelf() 方法停止自己

接下来分析start源码

@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

源码可知

1)在 onStartCommand() 中直接调用了 onStart() 方法

2)而上面 stopSelf() 方法使用的 startId 来停止当前的此次任务服务。

3)而 Service 如果被启动多次,就会存在多个 startId ,当所有的 startId 都被停止之后,才会调用 onDestory() 自我销毁。

我们在看看HandlerThread启动之后的源码

@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}

源码可知

1)run方法里面添加了锁,这也解释了为什么多次 start 同一个 IntentService 它会顺序执行,全部执行完成之后,再自我销毁。

最新文章

  1. 挑子学习笔记:特征选择——基于假设检验的Filter方法
  2. JQ_浏览器窗口改变触发
  3. C#is运算符的作用
  4. iOS的QuickTime Plugin
  5. Java总结篇系列:java.lang.Object
  6. 使用Java中的动态代理实现数据库连接池
  7. linux下google chrome浏览器字体修改
  8. bzoj 3172 后缀数组|AC自动机
  9. 精雕细琢 35 套精美的 PSD 图标素材
  10. 【Android中Broadcast Receiver组件具体解释 】
  11. Bootstrap快速入门
  12. iPhone X 适配
  13. php 下载保存文件保存到本地的两种实现方法
  14. [MySQL] explain中的using where和using index
  15. 4.1 socket
  16. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-1虚拟机安装及环境初始化
  17. web前端(15)—— JavaScript的数据类型,语法规范2
  18. 在Intellij IDEA中使用Maven的方式将项目导出为jar包
  19. Can not issue data manipulation statements with executeQuery()错误解决
  20. hadoop 分布式机群搭建

热门文章

  1. CentOS7.3 ARM虚拟机扩容系统磁盘
  2. JS正则表达式的基础用法
  3. JAVA学习,是一条漫长的道路
  4. Git知识总览(四) git分支管理之rebase 以及 cherry-pick相关操作
  5. 一个HTTP Basic Authentication引发的异常
  6. IO (二)
  7. Git版本管理的简介与安装[一]
  8. ng机器学习视频笔记(二) ——梯度下降算法解释以及求解θ
  9. ehcache模糊批量移除缓存
  10. 备忘:java在cmd中编译运行