IntentService 和 Service的区别

深入剖析Android系统中Service和IntentService的区别 主要介绍了Android系统中Service和IntentService的区别,与普通的服务相比,IntentService可以开启单独的线程来处理intent请求,需要的朋友可以参考下 立即下载

IntentService 和 Service的区别


相同点:IntentService 继承 于Service,本质上都是Service。

不同点:IntentService内部添加Handler+HandlerThread的实现,在onStart方法回调中,mServiceHandler发送一个消息到工作线程中执行调用onHandleIntent,并且可以在onHandleIntent方法中可以执行耗时操作,最后调用stopSelf方法结束该服务。通俗来说,IntentService可以在onHandleIntent中执行耗时操作。

直接上源码:

public abstract class IntentService extends Service {
    private volatile Looper         mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private          String         mName;
    private          boolean        mRedelivery;

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

   
    public IntentService(String name) {
        super();
        mName = name;
    }

   
    public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
    }

    @Override
    public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

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

   
    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        //mRedelivery 默认为false
        //onStartCommand方法返回有4种
        //START_STICKY:系统会重新创建service,然后呢由于重新创建了service,那么onstartCommand方法就一定会被重新调用,如果这个时候,没有其他启动service的命令传过来,那么这个时候的Intent就是null,这里需要注意一下
        //START_NOT_STICKY:系统被kill了,服务不会重新启动
        //START_REDELIVER_INTENT:这个是指服务被重新创建后,直接将之前Intent的值传入,和上面START_STICK不同,这里的Intent不会为null
        //START_STICKY_COMPATIBILITY:这个其实是用来兼容api5 一下的,这个的作用和START_STICK一样,但是这个返回值不能保证系统一定会重新创建service
        //
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

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

   
    @WorkerThread
    protected abstract void onHandleIntent(@Nullable Intent intent);
}

注意:

可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个...执行完,结束服务。

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址) 本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。 阅读详情

相关推荐

量子城域网建设设备系列(三):网络管理系统(NMS)

本文对量子网络中的网络管理系统进行了初步的介绍。

量子领域相关话题 2013

Nginx安装手册

Nginx安装手册 1nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境。 gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++ -y PCRE PCRE(Perl Compatible Regular Ex

白鱼的博客 480

3D Gaussian Splatting的使用

Gaussian splatting 快速生成自己屋子的模型

gootyking的博客 1万+

IntentService 与 Service的区别

IntentService 与 Service的区别:(service(不是单独进程和应用程序同进程)intentService(是一个处理异步请求类,专处理耗时任务)) Service 是长期运行在后台的应用程序组件。 Service 不是一个单独的进程,它和应用程序在同一个进程中, Service 也不是一个线程,它和线程没有任何关系,所以它不能直接处理耗时操作。 如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗时操作就必须开启一.

zjxwon的博客 3273

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 503

企业级 Agent 在 K8s 上的运行模型

Kubernetes├── Agent Orchestrator(控制面)├── Agent Runtime Pods(执行面)├── Graph DSL(流程层)├── Tool Services(能力层)K8s(调度)+ Graph(流程)+ Agent(决策)+ Tool(执行)+ Guard(治理)

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 1172

IntentService和Service区别

这是由于Android系统为了优化内存和电量消耗增加了对后台服务的限制。这些新的API提供了更灵活的后台任务调度能力,并更好地适应了Android系统的节能策略。在API level 30已被弃用,Google现在推荐使用。

weixin_45681365的博客 1039

彩票的未来:基于人工智能与大数据的创新预测模型

随着人工智能(AI)和大数据技术的迅猛发展,彩票行业正面临前所未有的变革。本文将探索如何通过结合深度学习、机器学习和数据挖掘技术,构建先进的预测模型,以提高彩票开奖结果的预测准确性。通过分析历史数据、应用现代化的计算技术,我们提出了一种创新的彩票预测软件架构,旨在推动彩票行业向着更加智能和高效的方向发展。

Sapphire521的博客 1440

IntentService与Service的深度解析

维度普通Service线程机制自动创建工作线程处理任务默认在主线程运行任务执行串行执行(单线程队列)需自行实现多线程逻辑生命周期任务完成后自动停止需手动调用stopSelf()停止实现复杂度只需实现onHandleIntent方法需完整管理线程和生命周期使用场景适合串行后台任务(如下载)需要灵活控制的任务。

斗锋在干嘛的博客 469

Siemens SIMATIC软件二次开发:使用C#进行SIMATIC软件二次开发

通过使用OPC-UA通信协议和S7通信库,可以有效地在C#应用程序中与Siemens SIMATIC软件进行数据交换。OPC-UA提供了一个标准化的平台,而S7通信库则提供了直接访问PLC数据的能力。掌握这两种通信方式,将极大地增强在工业自动化领域的二次开发能力。在Siemens SIMATIC软件中,自定义功能块开发是实现二次开发的关键步骤之一。通过C#,可以创建高度定制化的功能块,以满足特定的控制需求。下面,我们将通过一个示例来展示如何使用C#开发一个自定义功能块。OPC-UA通信。

kkchenjj的博客 1415

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1152

IntentService和Service的区别?

从两方面描述: 第一:简单描述一下Service   Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念。 那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR,为了解决这样的问题,引入了In

丿灬安之若死 4946

数仓建模—数据语义层

如今,企业产生大量数据,需要以正确的方式进行分析才能做出重要决策。数据可能来自多个来源并采用不同的格式,这使得清楚地了解其含义和重要性成为一项挑战。这就是语义层的用武之地。语义层存在于数据仓库和最终用户使用的应用程序之间。它为用户提供了简化且一致的数据视图,无论其基础数据源的复杂性如何。该逻辑层有助于映射物理数据结构以创建概念数据模型。它定义了数据元素之间的所有规则和关系,并以业务术语提供了数据的通用词汇表。然后,用户可以轻松地与数据进行交互,而无需了解其数据源的技术知识。

7万+

Service和IntentService的区别

Service和IntentService的区别 1. 首先IntentService是继承自Service; 2. Service不是一个单独的进程,它和应用程序在同一个进程中; 3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作; 4. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thre

Android司机 5457

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android Service和IntentService的区别

Service和IntentService的区别 之前介绍过Service的启动方式复习Android之Service的一种情怀 这次将介绍Service和IntentService的区别。Service在Android的学习过程中不可缺少的部分。只有学好它才能更好的学习Android。 IntentService简介 IntentService是继承Service的,所以IntentServic...

jhonjson的博客 2579

假人有限元模型

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

Android Service与IntentService区别

相同点: 1、首先Service与IntentService都是Android的基本组件service 2、使用时都是一样需要创建,配置;和调用启动方式都是一样的 不同点: 1、IntentService是继承自Service的service 类,创建了自己的特有方法onHandleIntent——这个方法的主要作用是: 而每一个耗时操作会以工作队列的方式在IntentService的o...

meixi_android的博客 2622

IntentService和Service的区别

IntentService和Service的使用方法基本上是一样的,只不过IntentService更像是一次性的Service,不会长期存在后台。在执行完onHandleIntent方法后就会调用停止方法,结束掉Service。

朱玉强的博客 1247

Service 和 IntentService的区别

Srevice不是在子线程,在Srevice中做耗时操作一样ANR,然后我们就会用到IntentService,IntentSrevice不但擅长做耗时操作,还有一个特点,用完即走; 在Srevice中做耗时轮询操作,使用Handler: public class MyService extends Service { public MyService() { } @Override publi...

awodefengduanwu的博客 137

service与IntentService 区别

关系:   IntentService继承service 区别:   IntentService 是一个带有HandlerThread的线程的service,把任务执行完成以后IntentService自动销毁。   Service要手动 调用stopSelf()来销毁。   IntentService 运行在子线程中,Service运行在主线程中 作用:   In...

dgyibo2014的博客 200

Service和IntentService区别

Service简介:Android四大组件之一,运行在后台,没有界面,因为运行在主线程中,所以不能在其中做耗时操作,回阻塞UI,解决办法是新起Thread线程,处理耗时操作 IntentService简介:继承至Service用来处理异步请求,并且在所有任务完成后会主动关闭服务 测试: service: package com.example.administrator.intentser

小蚂蚁的专栏 544

Android之Service与IntentService区别

在Android开发中,Service是一个可以在后台执行长时间运行操作的组件。主要有两种类型的Service:普通Service和IntentService。

追梦的鱼儿 1573

Service和IntentService 的区别

Service和IntentService的区别区别ServiceIntentServiceIntentService的使用源码分析为什么IntentService可用于执行后台耗时的任务,任务执行后会自动停止为什么IntentService具有高优先级为什么IntentService可以多次启动,每个耗时操作都会以工作队列的方式在onHandleIntent()回调方法中执行。 区别 Service 不是运行在独立的线程,所以不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。 IntentS

weixin_41504476的博客 804

Service和intentservice的区别

IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。            Service中提供了一个方法:   public int onStartCommand(I

qq_37541086的博客 339

Service与IntentService的区别

简单描述一下Service Service是用于后台服务的,当应用程序被挂到后台的时候,为了保证应用某些组件仍然可以工作而引入了Service这个概念。 那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR,为了解决这样的问题,引入了IntentService 简单描...

weixin_41205419的博客 1040
下一篇: LocalBroadcastManager发送广播 和context发送广播的区别
Alonesoo
博客等级 码龄12年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值