使用IntentService的正确姿势

IntentService 的使用与解析 前言 IntentService 本质上也属于 Service,它可以说是一个使用起来更为简单的 Service。在我们基本的 Service 使用过程中,我们需要在 Service 中自己开启子线程进行耗时操作,并且在 Service 执行结束后还要调用 stopSelf 或 stopService 方法来关闭 Service,而使用 IntentService 的话,这些问题将通通不需要关注。... 阅读详情

 

在开发安卓应用的过程中,我们经常需要这样的场景:希望APP在不影响当前用户的操作的前提下,在后台默默的做一些任务。比如:静默的下载文件或者上传数据。我们一般会考虑到新启一个线程去做异步的操作。不错,新启线程确实可以做到。那为啥还需要IntentService呢?

. 1.优点

  • 本质上IntentService也是开了一个线程,但是IntentService是继承自Service的,所以根据Android系统Kill Application的机制,使用IntentService的应用的优先级更高一点。通俗点说如果使用IntentService做后台任务时,当您的程序退到后台时,被杀死的几率会更低一点。
  • 既然IntentService是在Service里开启线程去做任务处理,那我直接在Service里启动线程去做不就好了吗?当然可以,但是IntentService已经帮您封装好了,为什么还要自己再去实现IntentService的一套逻辑呢?
  • IntentService会在任务执行完成后自行结束自己,而不需要外部去调用stopService了。

. 2.正确使用的姿势

优点我们已经知道了,那该如何正确的使用呢?我们知道Service可以通过startService和bindService这两种方式启动。当然喽,IntentService是继承自Service的,自然也是可以通过上面两种方式启动。但是呢,是不建议使用 bindService 去启动的。为什么呢?我们看下IntentService的源码:

 1    // 首先呢在Service的onCreate生命周期中创建了一个子线程的Handler
 2    @Override
 3    public void onCreate() {
 4        // TODO: It would be nice to have an option to hold a partial wakelock
 5        // during processing, and to have a static startService(Context, Intent)
 6        // method that would launch the service & hand off a wakelock.
 7
 8        super.onCreate();
 9        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
10        thread.start();
11
12        mServiceLooper = thread.getLooper();
13        mServiceHandler = new ServiceHandler(mServiceLooper);
14    }
15
16    private final class ServiceHandler extends Handler {
17        public ServiceHandler(Looper looper) {
18            super(looper);
19        }
20
21        @Override
22        public void handleMessage(Message msg) {
23            // 这个是我们子线程Handler调用 onHandleIntent()方法处理异步事物
24            onHandleIntent((Intent)msg.obj);
25            stopSelf(msg.arg1);
26        }
27    }

如果你通过bindService的方式启动,如果IntentService没有启动过,确实会走onCreate方法,但是onCreate中没有去调用handler的处理方法handleMessage。因为只有handleMessage方法调用后才会调用onHandleIntent方法去处理任务。那么IntentService在哪里去调用Handler的handleMessage方法的呢?我们看下面的源码部分:

1    @Override
2    public void onStart(@Nullable Intent intent, int startId) {
3        Message msg = mServiceHandler.obtainMessage();
4        msg.arg1 = startId;
5        msg.obj = intent;
6        // 此处调用
7        mServiceHandler.sendMessage(msg);
8    }

是onStart的生命周期里调用的。我们都知道bindService启动的生命周期是不会回调onStart的生命周期的,所以onHandleIntent的异步处理方法也不会回调。也就是说,如果您使用bindService方法启动IntentService,其实不会享受到IntentService的一点优点。onHandleIntent根本不会调用,和启动一个普通的Service没两样。

综上,我们应该使用startService的方式启动IntentService。并且通过源码我们知道,处理异步任务是在onIntentService中的。所以我们应该讲任务逻辑放在onIntentService中处理。

. 3.应用

学以致用。我们来看一个商业应用的实例,比如我们考虑这样一个简单的场景,我们如何从后台静默上传数据?简单捋一下,首先静默上传是指不会影响用户正常的交互的。所以我们考虑使用IntentService去异步处理,另外我们要考虑到如果上传失败,是否有重传的机制呢?所以我这里在上传失败的时候会缓存在本地,在下一次监听到网络变化时重新上传。

所以,第一步我会写一个BroadcastReceiver去监听网络的变化:

 1public class NetworkReceiver extends BroadcastReceiver {
 2
 3    private static final String TAG = NetworkReceiver.class.getSimpleName();
 4
 5    @Override
 6    public void onReceive(Context context, Intent intent) {
 7        SLog.d(NetworkReceiver.class.getSimpleName(), "onReceive");
 8        if (null == intent) {
 9            return;
10        }
11        SLog.d(TAG, "action=" + intent.getAction());
12        ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
13                .getSystemService(CONNECTIVITY_SERVICE);
14
15        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
16
17        if (null == networkInfo || !networkInfo.isConnected()) {
18            return;
19        }
20        long currentTimeMillis = System.currentTimeMillis();
21        if (currentTimeMillis - GlobalCacheManager.getInstance().lastNetworkConnectTimeMillis < 1000) {
22            SLog.d(TAG, "may be receive twice in the same time");
23            return;
24        }
25
26        // upload data by start intentservice
27        Intent serviceIntent = new Intent(context, YourUploadService.class);
28        context.startService(serviceIntent);
29
30    }
31}

第二步,写一个IntentService的实现类YourUploadService.java:

 1public class YourUploadService extends IntentService {
 2    public YourUploadService() {
 3        super("YourUploadService");
 4    }
 5
 6    @Override
 7    protected void onHandleIntent(Intent intent) {
 8        ConnectivityManager manager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
 9        NetworkInfo info = manager.getActiveNetworkInfo();
10        if (info != null) {
11            // TODO do your upload logic            }
12        }
13    }
14}

至此,我们应该学会了怎么正确的使用IntentService了。


完整源码可关注以下WX公众号(IT烂笔头),回复【职场】获取微信好友位

IT烂笔头

 

IntentService示例项目完整指南 本文还有配套的精品资源,点击获取 简介:IntentService是Android特有的用于处理后台任务的Service类型,它自动处理异步任务和线程池管理,防止应用程序无响应。它特别适合执行离散任务,如网络请求、数据同步或文件操作。本文将详细介绍IntentService的创建、启动和处理流程,并通过 IntentServiceDemo 项目演示其在实际开发... 阅读详情

相关推荐

AD9371 官方例程构建及单音信号收发

项目构建基本流程和AD9361差不多,由于官方使用的ZCU102,记录下移植遇到的一些问题最终接收到正确的正弦波Errors: 0Errors: 0Errors: 0Errors: 0AD9361。

weixin_44630490的博客 2971

IntentService使用姿势

https://blog.youkuaiyun.com/qq_33748378/article/details/52330382 https://blog.youkuaiyun.com/ryantang03/article/details/8146154 https://blog.youkuaiyun.com/hudashi/article/details/7986130 IntenteService使用姿势 1:

C++ JAVA的专栏 1309

EtherCAT APWR报文实战:从站地址配置(0x0010)的初始化流程与报文解析

本文详细解析了EtherCAT APWR报文在从站地址配置(0x0010寄存器)中的初始化流程与实战应用。通过类比物业分配门牌号,生动解释了APWR报文如何高效批量配置从站地址,并深入探讨了0x0010寄存器的特殊作用、初始化步骤及常见问题排查方法。文章结合IgH主站的三从站配置案例,提供了报文解析技巧和调试建议,帮助工程师快速掌握EtherCAT网络配置的核心技术。

weixin_28744423的博客 410

IntentService:深入解析与应用

它继承自Service类,并在内部使用工作线程来处理耗时的操作,从而避免了在主线成中执行这些任务可能导致的界面卡顿或者应用无响应的问题。本文将深入探讨IntentService的基本原理,特点,使用方法,优缺点以及实际开发中的应用场景。综上所述,IntentService在Android开发中是一个强大的后台任务处理工具,尤其适用于需要按照顺序执行的短期任务。然而,在处理需要并行执行或长期运行的任务时,可能需要考虑其他解决方案。是一个基于消息的后台服务,它使用了一个工作队列来处理所有的启动请求。

weixin_42487687的博客 2046

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2084

S7-200 SMART Modbus RTU从站配置与调试实战指南

本文提供了一份详细的S7-200 SMART PLC配置为Modbus RTU从站的实战指南。内容涵盖从硬件基础、软件准备、指令库调用、核心编程到地址映射与调试排错的完整流程。重点解析了MBUS_INIT与MBUS_SLAVE指令的关键参数配置,并深入探讨了Modbus地址与PLC内部V存储区的对应关系,帮助工程师快速打通通讯链路,实现与上位机、触摸屏等主站设备的稳定数据交互。

potato的博客 750

android四大组件-----Service的认识(IntentService的使用)

service的概念 1、service组件是可执行的程序,也是有自己的生命周期,是四大组件常用组件之一。创建、配置service和Activity的过程相似 service的作用 1、Service非常适用于去执行那些不需要和用户交互而且还要长期运行在后台的任务 service的特点 1、Service默认线程为UI线程,不要在Service中执行耗时的操作,除非你在Service中创...

Hunter2916的博客 945

HA集群 执行 hdfs haadmin -transitionToActive 失败

最近把一个单NameNode集群变更为HA集群,过程中都很顺利,nn1和nn2两个NameNode都显示standby状态,但是把nn1或者nn2切换到active状态时就会报错抛异常。 查看master上namenode启动日志,如下: Incompatible clusterID for journal Storage Directory /home/hadoop-zero/bigdat...

qq_34727158的博客 1763

Android使用IntentService

Android使用IntentService

Android应用开发工程师 1698

手把手教你用Qt和DSP28335实现串口Bootloader,附赠源码和避坑指南

本文详细介绍了如何使用Qt和DSP28335实现串口Bootloader,包括开发环境搭建、通信协议设计、Qt上位机开发、DSP端Bootloader核心实现以及应用程序工程的特殊配置。通过实战案例和源码分享,帮助开发者快速掌握嵌入式固件升级技术,提升工业设备远程升级的效率和可靠性。

weixin_29176179的博客 133

微信小程序URL Link全解析:从生成原理到实战应用(附Java代码)

本文深入解析微信小程序URL Link的生成原理与实战应用。URL Link是微信官方提供的智能路由协议,通过中间页实现外部链接安全跳转至小程序指定页面。文章详细阐述了其权限模型、环境版本差异及跳转机制,并提供了包含令牌管理、异常处理和性能优化的健壮Java实现方案,助力开发者构建高可用的链接生成服务。

weixin_29327525的博客 1216

Android中IntentService的原理及使用

在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Ac

Ryan's zone 3万+

为什么 ChatGPT 生成的下载地址会长成 sky-metal-cards-jerry.quirkypony34.chatgpt.site 这种奇怪的样子

我今天看到的这条地址,确实很容易让人产生一种感觉,ChatGPT 明明只是生成了几张 PNG 图片和一个压缩包,为什么最终拿到的却不是类似这种看起来很正规的下载链接,而是一长串带有、UUID、apidecks的地址。更容易让人疑惑的是,其中还出现了一个平时很少见到的域名。这并不是浏览器随机生成的临时 URL,也不是某个来历不明的第三方文件服务器。根据 OpenAI 在 2026 年公布的 ChatGPT Sites 文档和相关服务条款,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 57

Android IntentService详解

转载请注明出处:http://blog.youkuaiyun.com/vnanyesheshou/article/details/75073307 最近加深基础,看到个IntentService类,以前从来没有遇见过,更不知其用来干嘛的,所以就整理了一个demo,看看这个怎么使用。 1 简介 IntentService概括 IntentService is a base class for Se

奋斗的菜鸟ing 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android:IntentService的使用

一、IntentService简介  IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题:   Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中;   Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;

1024工场 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android之IntentService的使用

通过前面的学习,大家会发现我们在使用 Service 时总会创建一个线程来执行任务,而不是直接在 Service中执行。这是因为 Service 中的程序仍然运行于主线程中,当执行一项耗时操作时,不新建一个线程的话很容易导致 Application Not Responding 错误。当需要与 UI线程进行交互时,使用 Handler 机制来进行处理。 为了简化操作,Android提供了IntentService类。IntentService是 Android中提供的后台服务类,是Service 自动实现

PPYY3344的博客 2355

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

详解Android中IntentService的使用方法

为什么我们需要IntentService ? Android中的IntentService是继承自Service类的,在我们讨论IntentService之前,我们先想一下Service的特点: Service的回调方法(onCreate、onStartCommand、onBind、onDestroy)都是运行在主线程中的。当我们通过startService启动Service之后,我们就需要在S

sxl_0305 9917

IntentService的使用

IntentService是继承于Service和处理异步请求的一个类。 在IntentService内有一个工作线程来处理耗时操作,启动IntentService和传统的Service一样,但是当任务执行完成后,IntentService会自动停止,不需要手动停止。IntentService可以启动多次,并且每一个耗时操作会以工作队列的方式在IntentService的onHandleInte...

CjhLoveAndroid的博客 567

IntentService介绍及使用

IntentService是一个通过Context.startService(Intent)启动可以处理异步请求的Service,使用时你只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,在适当的时候会停止自己(一般在工作完成的时候). 所有的请求的处理都在一个工作线程中完成,它们会交替执行(但不会阻塞主线程的执行),一次

Hornsey的博客 5109

使用IntentService

其实IntentService和Service这两个类的用法都差不多,这两个类都可以定义服务,那么这两个类的区别是什么? 我的理解是:使用IntentService定义的服务,要开启线程,只要重写一个onHandleIntent()方法就可以了,而且在运行完之后会自动停止,如果使用Service定义服务,则需要手动开线程和手动添加stopSelf()方法才能运行完之后自动停止。 下面我们来使用In...

冰之沁泠的博客 401

Android姿势点梳理-IntentService

IntentService是Service类的子类,用来处理异步请求。客户端通过startService(Intent)方法传递请求给IntentService, IntentService通过worker thread处理每个Intent对象,执行完所有工作后自动停止Service。 写构造方法 复写onHandleIntent()方法 IntentService执行如下操作 ...

madoka_的博客 202

【Android】IntentService的使用

相比Service,IntentService变得更加简单,它会自动开启新线程去执行代码,而且执行完之后还会自己停止服务。下面记录IntentService的简单使用方法 一、layout布局 就放一个button就好 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr...

冰冷的希望的博客 478

intentservice_使用intentService在Android中使用Webservice

intentservice 在本文中,我将解释如何使用IntentService来使用Restful Webservice。 我们知道我们可以使用Volley lib或简单的Http客户端直接在UI中使用Webservice,但是在某些情况下,我们更喜欢在Android Service中使用Webservice。 我们知道,Android Service比Android Activity的寿命...

cunfen8879的博客 211
上一篇: 番外篇-Flutter初识三问
下一篇: 自定义控件之带渐变色的圆形进度条
IT烂笔头
博客等级 码龄15年 621粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值