IntentService用法

IntentService 用完即走

    IntentService,可以看做是Service和HandlerThread的结合体,在完成了使命之后会自动停止,适合需要在工作线程处理UI无关任务的场景。

  • IntentService 是继承自 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作。
  • 当任务执行完后,IntentService 会自动停止,不需要我们去手动结束。
  • 如果启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中执行,依次去执行,使用串行的方式,执行完自动结束。

 

IntentService继承自Service,内部有一个HandlerThread对象。

    在onCreate的时候会创建一个HandlerThread对象,并启动线程。紧接着创建ServiceHandler对象,ServiceHandler继承自Handler,用来处理消息。ServiceHandler将获取HandlerThread的Looper就可以开始正常工作了。

    每启动一次onStart方法,就会把数消息和数据发给mServiceHandler,相当于发送了一次Message消息给HandlerThread的消息队列。mServiceHandler会把数据传个onHandleIntent方法,onHandleIntent是个抽象方法,需要在IntentService实现,所以每次onStart方法之后都会调用我们自己写的onHandleIntent方法去处理。处理完毕使用stopSelf通知HandlerThread已经处理完毕,HandlerThread继续观察消息队列,如果还有未执行玩的message则继续执行,否则结束。

 

启动 IntentService 为什么不需要新建线程?

IntentService内部的HandlerThread 继承自 Thread,内部封装了 Looper,在这里新建线程并启动,所以启动 IntentService 不需要新建线程。

 

为什么不建议通过 bindService() 启动 IntentService?

@Override
public IBinder onBind(Intent intent) {return null;
}

    IntentService 源码中的 onBind() 默认返回 null;不适合 bindService() 启动服务,如果你执意要 bindService() 来启动 IntentService,可能因为你想通过 Binder 或 Messenger 使得 IntentService 和 Activity 可以通信,这样那么 onHandleIntent() 不会被回调,相当于在你使用 Service 而不是 IntentService。

 

为什么多次启动 IntentService 会顺序执行事件,停止服务后,后续的事件得不到执行?

@Override
public void onStart(Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);
}@Override
public void onDestroy() {mServiceLooper.quit();
}

    IntentService 中使用的 Handler、Looper、MessageQueue 机制把消息发送到线程中去执行的,所以多次启动 IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行,而如果服务停止,会清除消息队列中的消息,后续的事件得不到执行。

 

原文:https://blog.csdn.net/iromkoear/article/details/63252665

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TeaPot 用webgl画茶壶(3) 环境纹理和skybox

1 <html>2 <head>3 <title>TeaPolt</title>4 </head>5 6 <body οnlοad"main()">7 <canvas id"viewPort" width"600" height"600">8 This b…

java打包维护_java打包详解

from yahh2008的blog: http://www.matrix.org.cn/blog/yahh2008/兄弟&#xff0c;对java着迷吗&#xff0c;或者是为了自己的生计&#xff0c;不论怎样都欢迎你进入精彩java世界&#xff0c;welcome&#xff01;可能你刚刚对每个人说&#xff1a;Hello World&#xff01;也或者…

Linux高级文本处理之sed(三)

sed高级命令sed允许将多行内容读取到模式空间&#xff0c;这样你就可以匹配跨越多行的内容。本篇笔记主要介绍这些命令&#xff0c;它们能够创建多行模式空间并且处理之。其中&#xff0c;N/D/P这三个多行命令分别对应于小写的n/d/p命令&#xff0c;后者我们在上一篇已经介绍。…

如何在 C# 程序中注入恶意 DLL ?

一&#xff1a;背景 前段时间在训练营上课的时候就有朋友提到一个问题&#xff0c;为什么 Windbg 附加到 C# 程序后&#xff0c;程序就处于中断状态了&#xff1f;它到底是如何实现的&#xff1f;其实简而言之就是线程的远程注入&#xff0c;这一篇就展开说一下。二&#xff1a…

练习题|网络编程-socket开发

原文&#xff1a;https://www.cnblogs.com/shengyang17/p/8822745.html 1、什么是C/S架构&#xff1f; C指的是client&#xff08;客户端软件&#xff09;&#xff0c;S指的是Server&#xff08;服务端软件&#xff09;&#xff0c;C/S架构的软件&#xff0c;实现服务端软件与客…

okhttputils java_Java OkHttpUtils.post方法代码示例

import com.zhy.http.okhttp.OkHttpUtils; //导入方法依赖的package包/类Overridepublic void performRequestAsync(AyoRequest request, BaseResponseDispatcher responseHandler, BaseHttpCallback callback) {String url request.url;//基于OkHttpUtils辅助类//1 method决定…

近日安排

先把二分题做了&#xff0c;二分哪个小白书学了。 做图论题&#xff0c;4道转载于:https://www.cnblogs.com/no-regrets/p/7215366.html

ABP vNext微服务架构详细教程(补充篇)——单层模板(上)

简介在之前的《ABP vNext微服务架构详细教程》系列中&#xff0c;我们已经构建了完整的微服务架构实例&#xff0c;但是在开发过程中&#xff0c;我们会发现每个基础服务都包含10个类库&#xff0c;这是给予DDD四层架构下ABP的实现方案&#xff0c;但是实际使用中我们会发现&am…

JQuery this和$(this)的区别及获取$(this)子元素对象的方法

1.JQuery this和$(this)的区别 // this其实是一个Html 元素。 // $this 只是个变量名&#xff0c;加$是为说明其是个jquery对象。 // 而$(this)是个转换&#xff0c;将this表示的dom对象转为jquery对象&#xff0c;这样就可以使用jquery提供的方法操作。 相信很多刚接触JQuery的…

mybatis源码学习(三):MappedStatement的解析过程

我们之前介绍过MappedStatement表示的是XML中的一个SQL。类当中的很多字段都是SQL中对应的属性。我们先来了解一下这个类的属性&#xff1a; public final class MappedStatement {private String resource;private Configuration configuration;//sql的IDprivate String id;//…

sealed java_Java包isSealed()方法与示例

包类isSealed()方法isSealed()方法在java.lang包中可用。isSealed()方法用于检查此程序包是否密封。isSealed()方法是一种非静态方法&#xff0c;只能通过类对象访问&#xff0c;如果尝试使用类名称访问该方法&#xff0c;则会收到错误消息。isSealed()方法在密封包装时不会引发…

java enum分析

用法一&#xff1a;常量 在JDK1.5 之前&#xff0c;我们定义常量都是&#xff1a; public static fianl.... 。现在好了&#xff0c;有了枚举&#xff0c;可以把相关的常量分组到一个枚举类型里&#xff0c;而且枚举提供了比常量更多的方法。 public enum Color { RED, GREEN,…

1176: C语言实验题――数组逆序

描述:输入10个整数存入一维数组&#xff0c;再按逆序重新存放后再输出。输入:输入包括一行。 10个以空格格开的整数输出:逆序的10个整数&#xff0c;整数以空格格开样例输入:1 3 5 9 7 6 8 2 4 0样例输出:0 4 2 8 6 7 9 5 3 1考点:数的交换代码: #include <stdio.h> int …

C# 二十年语法变迁之 C# 8参考

C# 二十年语法变迁之 C# 8参考自从 C# 于 2000 年推出以来&#xff0c;该语言的规模已经大大增加&#xff0c;我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解。因此&#xff0c;我想写一系列快速参考文章&#xff0c;总结自 C# 2.0 以来所有主要的新语言…

windows 提权 cve-2018-8897

windows 提权 cve-2018-8897影响范围&#xff1a;基本上是全版本具体影响范围看详情&#xff1a;https://portal.msrc.microsoft.co … isory/CVE-2018-8897http://www.o2oxy.cn/wp-content/uploads/2018/06/cve-2018-8897.rar转载于:https://blog.51cto.com/9861015/2126608

java servlet练习测试

步骤&#xff1a; 0、首先创建web project&#xff0c;工程名&#xff1a;test_servlet 1、编写Servlet&#xff0c;TestServlet.java文件内容&#xff1a; package com.ouyang.servlet;import java.io.IOException; import java.sql.Connection; import java.sql.DriverManage…

java 检测ip网速_java心跳测网速Demo

//心跳中可以放//自己瞎搞的&#xff0c;有人帮改进吗&#xff1f;package netTest;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;public class net_test_one {public static void main(String[] args) {try {String[] cmd ne…

简洁的 Bash Programming 技巧(三)

这是简洁的 Bash Programming 技巧系列的第三篇文章&#xff0c;这一系列的文章专门介绍 Bash 编程中一些简洁的技巧&#xff0c;帮助大家提高平时 Bash 编程的效率。有兴趣的同学可以回顾下之前的两篇文章&#xff08;一&#xff09;和续篇。 1. 替换语法${parameter/pattern/…

《ASP.NET Core 6框架揭秘》实例演示[19]:数据加解密与哈希

数据保护&#xff08;Data Protection&#xff09;框架旨在解决数据在传输与持久化存储过程中的一致性&#xff08;Integrity&#xff09;和机密性&#xff08;confidentiality&#xff09;问题&#xff0c;前者用于检验接收到的数据是否经过篡改&#xff0c;后者通过对原始的数…

java开发保险案例_Java实现双保险线程的示例代码

双保险线程&#xff0c;每次启动2个相同的线程&#xff0c;互相检测&#xff0c;避免线程死锁造成影响。两个线程都运行&#xff0c;但只有一个线程执行业务&#xff0c;但都会检测对方的时间戳 如果时间戳超过休眠时间3倍没有更新的话&#xff0c;则重新启动对方线程。例子&am…