Android:IntentService的学习
在Android
的四大组件中,Service
排行老二,在Android
中的主要作用是后台服务,进行与界面无关的操作。由于Service
运行在主线程,所以进行异步操作需要在子线进行。为此Android
为我们提供了IntentService
。 IntentService
是一个抽象类,继承至Service
,主要方便我们新建工作线程进行异步操作。提交任务到IntentService
时,异步任务以串行方式进行处理,意味着工作线程一次只处理一个任务。而且当所有任务都完成之后,会自动停止Service
,不需要我们手动停止。
IntentService 的使用
- 我们定义
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);}
}复制代码
- 在AndroidManifest.xml配置
DownloadService
。
<service android:name=".DownloadService"/>
复制代码
- 在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);}}
复制代码
- 运行结果
分析: 从运行结果知道,IntentService
在运行多个任务情况下,只调用一次onCreate
,调用多次onStartCommand
,跟Service
的生命周期一致。但,只有在运行完download:1
之后才会去运行download:2
,接着是download:3
。最后所有任务结束后会自动调用onDestroy
,停止服务。在这里需要注意的是,和Service
并不同,Service
需要我们手动停止服务。对于结果的回调,可以采用接口回调,广播,EventBus
。
那么,IntentService
是如何在Service
中实现异步操作和串行处理任务的呢?
IntentService内部实现
- 查看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
消息机制来达到串行的效果和处理多任务。HandThread
和Handler
消息机制,可以另外查看文章。
分析二
ServiceHandler
继承Handler
,与普通的Handler
并没有区别,在其内容处理handleMessage
。即调用IntentService
的onHandleIntent
;
private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}}
复制代码
- 那么,当我们在
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的学习相关推荐
- Android 性能优化—— 启动优化提升60,Android开发全套学习
在入口 Acitivity 中开启 IntentService 来下载广告页. 或者是其它异步下载操作. 在广告页图片 文件流完全写入后 记录图片大小,或者记录一个标识. 在下次的广告页加载中可以判断 ...
- 基于 Android NDK 的学习之旅-----资源释放
基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...
- 基于 Android NDK 的学习之旅----- C调用Java
2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...
- 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)
基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1. String ...
- Android IntentService解析
Android IntentService解析 在开发安卓应用程序时,除非你指定,否则绝大部分执行动作都运行UI线程中.这种机制会引发一些问题,因为耗时操作会妨碍用户交互行为.这会让用户感到懊恼,甚至 ...
- 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...
- 基于android的交流平台,基于Android的移动学习交流平台的设计与实现
摘要: 随着移动互联网技术的不断发展,智能手机的不断普及,现在越来越多的人通过手机等智能设备来进行学习和交流.为了满足教师和学生实时的沟通交流,提高学生的学习兴趣和效率,本文设计了基于Android的 ...
- Android基础知识学习
一.Android编译过程 初始化参数设置 检查环境变量与目标环境 选择lunch并读取目标配置和平台信息 清空输出目录 编译 生成升级包 二. ./build/envsetup.sh分析 加载编译命 ...
- 基于 Android NDK 的学习之旅-----Java 调用C(附源码)
基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1. 有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...
最新文章
- keyvaluepair_C# KeyValuePairTKey,TValue的用法【转】 .
- Informatica PowerCenter使用介绍-转载
- 3d旋转相册代码源码_原生 JS 实现 3D 立方体
- c和java内存泄漏区别_内存溢出和内存泄漏的区别(转)
- 乐高科技系列搭建指南 pdf_近30年十辆乐高科技系列摩托车回顾_积木
- 解决:Maven resources compiler: Maven project configuration required for module ‘c,不识别Maven项目
- Photoshop小技巧集锦八十条
- 2021-06-28DOM节点插入
- GNS3 2.1.9版本的安装
- SecureCRT和SecureFX的下载和安装2022
- python 饼图代码_Python中使用Matplotlib画出饼图的代码实例
- PEGA 十合一吉他控制器连接电脑玩《吉他英雄3》
- 推荐系统中的常用算法——基于Graph Embedding的GES和EGES
- 1024,程序员“赚钱”秘籍倾囊而赠!
- Oracle 外部表
- css都能作哪些特效,推荐10款重量级CSS3的全新特效
- convs在MATLAB中,matlab2_MATELAB课程设计_ppt_大学课件预览_高等教育资讯网
- 小姐姐教你用代码画画,真大佬!
- 什么是死锁?如何避免死锁?
- UI设计 AndroidIOS开发推荐用色
热门文章
- scala 函数中嵌套函数_Scala合成函数
- 已知有几个数据存放在BUF为首址的字节存储区中,试统计其中正数的个数,并将结果存入ZNUM单元中。
- python安全攻防---信息收集---whois查询
- solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中
- 装配图位置偏转怎么调整_物理微课|匀变速直线运动、电容器动态分析及磁偏转技巧、方法、模型...
- 使用虚拟环境virtualenv 创建虚拟环境出现PermissionError: [Errno 13] Permission denied:
- c++常见并且必须记住的问题
- 操作系统【八】文件管理
- string类的基本实现
- 07-图4 哈利·波特的考试 (25 分)