Android的四大组件中,Service排行老二,在Android中的主要作用是后台服务,进行与界面无关的操作。由于Service运行在主线程,所以进行异步操作需要在子线进行。为此Android为我们提供了IntentServiceIntentService是一个抽象类,继承至Service,主要方便我们新建工作线程进行异步操作。提交任务到IntentService时,异步任务以串行方式进行处理,意味着工作线程一次只处理一个任务。而且当所有任务都完成之后,会自动停止Service,不需要我们手动停止。

IntentService 的使用

  1. 我们定义DownloadService类并继承至IntentService。来模拟网络下载的过程。
public class DownloadService extends IntentService {private static int count = 0;/*** 主要用于调用服务类构造器** @param name 用于区分不同任务*/public DownloadService(String name) {super(name);}/*** AndroidManifest.xml配置清单需要配置** @param*/public DownloadService() {super("action");}/***主要重写该方法,在该方法内进行异步操作。**/@Overrideprotected void onHandleIntent(Intent intent) {Log.i("Download", "onHandleIntent" + count);count++;String name = intent.getStringExtra("action");if (name.equals("download")) {for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();return;}Log.i("Download", "download:" + count);}}}//以下方法的重写,仅仅为了打印日志@Overridepublic void onDestroy() {super.onDestroy();Log.i("Download", "onDestroy");}@Overridepublic void onCreate() {super.onCreate();Log.i("Download", "onCreate");}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);Log.i("Download", "onStart");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("Download", "onStartCommand");return super.onStartCommand(intent, flags, startId);}
}复制代码
  1. 在AndroidManifest.xml配置DownloadService
<service android:name=".DownloadService"/>
复制代码
  1. 在MainActivity类中循环调用Service,启动多循环任务。
 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent=new Intent(this,DownloadService.class);for (int i =0;i<3;i++){intent.putExtra("action","download");intent.putExtra("count",""+i);startService(intent);}}
复制代码
  1. 运行结果

分析: 从运行结果知道,IntentService在运行多个任务情况下,只调用一次onCreate,调用多次onStartCommand,跟Service的生命周期一致。但,只有在运行完download:1之后才会去运行download:2,接着是download:3。最后所有任务结束后会自动调用onDestroy,停止服务。在这里需要注意的是,和Service并不同,Service需要我们手动停止服务。对于结果的回调,可以采用接口回调,广播,EventBus

那么,IntentService是如何在Service中实现异步操作和串行处理任务的呢?

IntentService内部实现

  1. 查看IntentService的onCreate方法
 @Overridepublic void onCreate() {super.onCreate();//分析一HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();分析二mServiceHandler = new ServiceHandler(mServiceLooper);}
复制代码

分析一

HandThread继承Thread,通过start方法创建工作线程,内部建立Looper来达到消息循环,通过Hanlder消息机制来达到串行的效果和处理多任务。HandThreadHandler消息机制,可以另外查看文章。

分析二

ServiceHandler继承Handler,与普通的Handler并没有区别,在其内容处理handleMessage。即调用IntentServiceonHandleIntent

  private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}}
复制代码
  1. 那么,当我们在Activity中重复调用startService方法时,只会多次调用onStartCommand方法,并不会重复调用onCreate方法。我们看看onStartComamnd方法的实现。
    @Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}
复制代码

可以看得出,调用了onStart方法了。而onStart方法只是将我们的Intent包装成Message,通过Handler发送出去,并在Handler中进行处理,调用我们的onHandleIntent。进而调用我们实现onHandleIntent的代码。

    @Overridepublic void onStart(@Nullable Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);}
复制代码

总结

IntentService并没有什么的新的技术含量,在了解HandlerTread和Handler的消息机制下,对Handler+Thread+Service作一个封装,更适合我们后台进行异步耗时操作的场景。有效避免通过new多个Thread

知识点分享

Android消息机制

HandlerThread必知必会

如果觉得文章有用,给文章点个赞,铁子

Android:IntentService的学习相关推荐

  1. Android 性能优化—— 启动优化提升60,Android开发全套学习

    在入口 Acitivity 中开启 IntentService 来下载广告页. 或者是其它异步下载操作. 在广告页图片 文件流完全写入后 记录图片大小,或者记录一个标识. 在下次的广告页加载中可以判断 ...

  2. 基于 Android NDK 的学习之旅-----资源释放

    基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...

  3. 基于 Android NDK 的学习之旅----- C调用Java

    2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...

  4. 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)

    基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String ...

  5. Android IntentService解析

    Android IntentService解析 在开发安卓应用程序时,除非你指定,否则绝大部分执行动作都运行UI线程中.这种机制会引发一些问题,因为耗时操作会妨碍用户交互行为.这会让用户感到懊恼,甚至 ...

  6. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  7. 基于android的交流平台,基于Android的移动学习交流平台的设计与实现

    摘要: 随着移动互联网技术的不断发展,智能手机的不断普及,现在越来越多的人通过手机等智能设备来进行学习和交流.为了满足教师和学生实时的沟通交流,提高学生的学习兴趣和效率,本文设计了基于Android的 ...

  8. Android基础知识学习

    一.Android编译过程 初始化参数设置 检查环境变量与目标环境 选择lunch并读取目标配置和平台信息 清空输出目录 编译 生成升级包 二. ./build/envsetup.sh分析 加载编译命 ...

  9. 基于 Android NDK 的学习之旅-----Java 调用C(附源码)

    基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...

最新文章

  1. keyvaluepair_C# KeyValuePairTKey,TValue的用法【转】 .
  2. Informatica PowerCenter使用介绍-转载
  3. 3d旋转相册代码源码_原生 JS 实现 3D 立方体
  4. c和java内存泄漏区别_内存溢出和内存泄漏的区别(转)
  5. 乐高科技系列搭建指南 pdf_近30年十辆乐高科技系列摩托车回顾_积木
  6. 解决:Maven resources compiler: Maven project configuration required for module ‘c,不识别Maven项目
  7. Photoshop小技巧集锦八十条
  8. 2021-06-28DOM节点插入
  9. GNS3 2.1.9版本的安装
  10. SecureCRT和SecureFX的下载和安装2022
  11. python 饼图代码_Python中使用Matplotlib画出饼图的代码实例
  12. PEGA 十合一吉他控制器连接电脑玩《吉他英雄3》
  13. 推荐系统中的常用算法——基于Graph Embedding的GES和EGES
  14. 1024,程序员“赚钱”秘籍倾囊而赠!
  15. Oracle 外部表
  16. css都能作哪些特效,推荐10款重量级CSS3的全新特效
  17. convs在MATLAB中,matlab2_MATELAB课程设计_ppt_大学课件预览_高等教育资讯网
  18. 小姐姐教你用代码画画,真大佬!
  19. 什么是死锁?如何避免死锁?
  20. UI设计 AndroidIOS开发推荐用色

热门文章

  1. scala 函数中嵌套函数_Scala合成函数
  2. 已知有几个数据存放在BUF为首址的字节存储区中,试统计其中正数的个数,并将结果存入ZNUM单元中。
  3. python安全攻防---信息收集---whois查询
  4. solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中
  5. 装配图位置偏转怎么调整_物理微课|匀变速直线运动、电容器动态分析及磁偏转技巧、方法、模型...
  6. 使用虚拟环境virtualenv 创建虚拟环境出现PermissionError: [Errno 13] Permission denied:
  7. c++常见并且必须记住的问题
  8. 操作系统【八】文件管理
  9. string类的基本实现
  10. 07-图4 哈利·波特的考试 (25 分)