IntentService介绍
1.IntentService 是什么
- 一个封装了HandlerThread和Handler的异步框架。
- 是一种特殊Service,继承自Service,是抽象类,必须创建子类才可以使用。
- 可用于执行后台耗时的任务,任务执行后会自动停止
- 具有高优先级(服务的原因),优先级比单纯的线程高很多,适合高优先级的后台任务,且不容易被系统杀死。
- 启动方式和Service一样。
- 可以多次启动,每个耗时操作都会以工作队列的方式在IntentService的onHandleIntent回调方法中执行。
- 串行执行。
2. IntentService的执行方式是串行还是并行
串行
3. IntentService可以执行大量的耗时操作?
- 如果只有一个任务,是可以进行耗时操作的。
- 如果有很多任务,由于内部的HandlerThread是串行执行任务,会导致耗时操作阻塞了后续任务的执行。
4. IntentService和Service的区别
- 继承自Service
- IntentService任务执行完后会自动停止
- IntentService和Service优先级一致,比Thread高。
- Service处于主线程不能直接进行耗时操作; IntentService内部有HandlerThread,可以进行耗时操作。
5. IntentService的基本使用
1. 定义IntentService,实现onHandleIntent()'
- public class LocalIntentService extends IntentService {
- public static final String TAG="LocalIntentService";
- public LocalIntentService( ) {
- super(TAG);
- }
- @Override
- protected void onHandleIntent(Intent intent) {
- String task=intent.getStringExtra("task");
- Log.e(TAG, "onHandleIntent: task:"+task );
- }
- @Override
- public void onCreate() {
- super.onCreate();
- Log.e(TAG, "onCreate: " );
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "onDestroy: " );
- }
- }
2.AndroidMainfest.xml 中声明ItnentService
- <service android:name=".LocalIntentService"/>
3. 开启IntentService
- findViewById(R.id.bt1).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent service=new Intent(MainActivity.this,LocalIntentService.class);
- service.putExtra("task","task1");
- startService(service);
- service.putExtra("task","task2");
- startService(service);
- service.putExtra("task","task3");
- startService(service);
- service.putExtra("task","task4");
- startService(service);
- }
- });
日志:
6. 源码和原理机制
1.IntetntService的OnCreate底层原理
- 构造了HandlerThread
- 并在每部保存了HandlerThread的Looper
- 并且使用该Looper创建了ServiceHandler
- //IntentService第一次启动调用
- public void onCreate() {
- super.onCreate();
- //1. 创建一个HanlderThread
- HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
- thread.start();
- //2. 通过HanlderThread的Looper来构建Handler对象mServiceHandler
- mServiceLooper = thread.getLooper();
- mServiceHandler = new ServiceHandler(mServiceLooper);
2. IntentService的ServiceHandler
- HandlerThread会串行的取出任务并且执行,会调用ServiceHandler的handleMessage去处理任务。
- handlerMessage会去调用我们自定义的onHandleIntent
- 任务执行完毕后通过stopSelf(startId)停止Service。
- 任务结束后,在onDestory()中会退出HandlerThread中Looper的循环。
- //ServiceHandler接收并处理onStart()方法中发送的Msg
- private final class ServiceHandler extends Handler {
- public ServiceHandler(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- //1. 直接在onHandleIntent中处理(由子类实现)
- onHandleIntent((Intent)msg.obj);
- /**=================================================
- * 2. 尝试停止服务(会等待所有消息都处理完毕后,才会停止)
- * 不能采用stopSelf()——会立即停止服务
- *================================================*/
- stopSelf(msg.arg1); //会判断启动服务次数是否与startId相等
- }
- }
- public void onDestroy() {
- mServiceLooper.quit();
- }//销毁时会停止looper
3. IntentService内部去停止Service为什么不直接采用stopSelf()
- 采用stopSelf()——会立即停止服务
- 采用stopSelf(startId),会等所有消息全部处理完毕后,才会停止。
会判断启动服务次数是否与startId相等
4. IntentService是如何停止HandlerThread的Looper消息循环的?
- 调用stopSelf(startId)后。
- 任务全部执行完,会停止服务,并且回调onDestory()。调用Looper的quit()方法即可
5. IntentService 多次startService会多次回调onHandleIntent()的内部流程?
- startService()->onStartCommand()->onStart()
- 通过HandlerThread的handler去发送消息。
- HandlerThread在处理任务时,会去调用onHandleIntent方法。
- public abstract class IntentService extends Service {
- private volatile Looper mServiceLooper;
- private volatile ServiceHandler mServiceHandler;
- ...省略...
- //IntentService每次启动都会调用
- public int onStartCommand(Intent intent, int flags, int startId) {
- //3. 直接调用onStart
- onStart(intent, startId);
- return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
- }
- public void onStart(Intent intent, int startId) {
- //4. 通过mServiceHandler发送一个消息(该消息会在HanlderThread中处理)
- Message msg = mServiceHandler.obtainMessage();
- msg.arg1 = startId;
- msg.obj = intent;
- mServiceHandler.sendMessage(msg);
- }
- //2. 该Intent与startService(intent)中的Intent完全一致
- protected abstract void onHandleIntent(Intent intent);
- }
6. IntentService的源码总结:
- IntentService通过发送消息的方式向HandlerThread请求执行任务
- HandlerThread中的looper是顺序处理消息,因此有多个后台任务时,都会按照外界发起的顺序排队执行
- 启动流程:onCreate()->onStartCommand()->onStart()
- 消息处理流程:ServiceHandler.handleMessage()->onHandleIntent()
参考:
IntentService详解
IntentService介绍的更多相关文章
- 【转载】Android IntentService使用全面介绍及源码解析
一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何wo ...
- Android Service总结05 之IntentService
Android Service总结05 之IntentService 版本 版本说明 发布时间 发布人 V1.0 添加了IntentService的介绍和示例 2013-03-17 Skywang ...
- Android Service详解
service作为四大组件值得我们的更多的关注 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务.例如,一个从service播放音乐的音乐播放器,应 ...
- Android Service总结03 之被启动的服务 -- Started Service
Android Service总结03 之被启动的服务 -- Started Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Sky ...
- Android IntentService使用介绍以及源码解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...
- Android中的IntentService
首先说下,其他概念:Android中的本地服务与远程服务是什么? 本地服务:LocalService 应用程序内部------startService远程服务:RemoteService androi ...
- Android之Notification介绍
Notification就是在桌面的状态通知栏.这主要涉及三个主要类: Notification:设置通知的各个属性. NotificationManager:负责发送通知和取消通知 Notifica ...
- IntentService源码分析
和HandlerThread一样,IntentService也是Android替我们封装的一个Helper类,用来简化开发流程的.接下来分析源码的时候 你就明白是怎么回事了.IntentService ...
- 【Android】IntentService & HandlerThread源码解析
一.前言 在学习Service的时候,我们一定会知道IntentService:官方文档不止一次强调,Service本身是运行在主线程中的(详见:[Android]Service),而主线程中是不适合 ...
随机推荐
- 收藏的一些github开源项目,在这里记录一下
1.在windows系统上在命令行中执行rm -fr */*.file 会报错, rimraf这个项目提供了跨平台支持rm命令,github地址: https://github.com/isaacs/ ...
- Chrome JS断点调试技巧
Chrome调试折腾记_(2)JS断点调试技巧 技巧一:格式化压缩代码 技巧二:快速跳转到某个断点的位置 技巧三:查看断点内部的作用范围[很实用] 技巧4:监听事件断点 技巧5:DOM及 XHR监听跳 ...
- java之扫描包里面的class文件
一.class作为,编译过后的产物,在很多时候,我们需要通过反射去执行class的具体方法.但是扫描class就是一个很大的问题了. 二.所以我这里写了一个简单的class文件扫描方式. 三.主要是利 ...
- ACM-ICPC 2018全国邀请赛(陕西西安)
一.火车晚点 星期五下午4.36的火车,我们3点到了长沙火车站.差不多4点了,提示,晚点1h45min,DZC马上说,不知道会不会延误郑州到西安的那趟车.过了一会,又提示,晚点2h17min,再过一会 ...
- pythonNet day02
网络收发缓冲区 1.协调读写速度.减少和磁盘交互 2.recv和send实际上是从缓冲区获取内容,和向缓冲区发送内容 recv()特性 1.如果连接断开,recv会立即结束阻塞返回空字符串 2.当接收 ...
- 通过日志查看Web Api详细运行过程
1. 通过Nuget安装System.Web.Http.Tracing. 2. 通过HttpConfiguration,注册SystemDiagnosticsTraceWriter public st ...
- SpringBoot2.0实现静态资源版本控制
写在最前面 犹记毕业第一年时,公司每次发布完成后,都会在一个群里通知[版本更新,各部门清理缓存,有问题及时反馈]之类的话.归根结底就是资源缓存的问题,浏览器会将请求到的静态资源,如JS.CSS等文件缓 ...
- string ids=aduuids.Aggregate("", (m, n) => m + n+",").TrimEnd(',');
string ids=aduuids.Aggregate("", (m, n) => m + n+",").TrimEnd(',');
- CSS控制文字只显示一行 超出部分显示省略号
<p style="width: 120px; height: 50px; border: 1px solid blue; white-space: nowrap; over ...
- U3D 如何计算一个UI四个角的绝对坐标
//方式一,使用API获取 var rtrans = gameObject.GetComponent<RectTransform>(); Vector3[] worldcorners ...