Android之Service与IntentService的比较 .

实战指南:CentOS 7下VOS3000 8.0从零部署到授权激活全流程 本文提供了一份详尽的CentOS 7系统下部署VOS3000 8.0的实战指南。从环境准备、使用FileZilla上传安装包、执行自动化安装脚本,到获取软件码、利用注册机生成授权文件并激活,手把手带领用户完成从零部署到投入商用的全流程,确保系统稳定运行。 阅读详情
不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得。

    首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方:

      1.A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.

      2.A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).

      稍微翻一下(英文水平一般大笑)

      1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。

      2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作

关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现Application Not Responding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。

       有人肯定会问,那么为什么我不直接用Thread而要用Service呢?关于这个,大家可以网上搜搜,这里不过多解释。有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。  

       IntentService相对于Service来说,有几个非常有用的优点,首先我们看看官方文档的说明:

         IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests throughstartService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

         This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

         All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.

            稍微翻译理一理,这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。下面给一个小例子:

1.Service:

  1. package com.zhf.service;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6.   
  7. public class MyService extends Service {  
  8.   
  9.     @Override  
  10.     public void onCreate() {  
  11.         super.onCreate();  
  12.     }  
  13.       
  14.     @Override  
  15.     public void onStart(Intent intent, int startId) {  
  16.         super.onStart(intent, startId);  
  17.         //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作   
  18.         System.out.println("onStart");  
  19.         try {  
  20.             Thread.sleep(20000);  
  21.         } catch (InterruptedException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.         System.out.println("睡眠结束");  
  25.     }  
  26.       
  27.     @Override  
  28.     public IBinder onBind(Intent intent) {  
  29.         return null;  
  30.     }  
  31. }  

 2.IntentService:

  1. package com.zhf.service;  
  2.   
  3. import android.app.IntentService;  
  4. import android.content.Intent;  
  5.   
  6. public class MyIntentService extends IntentService {  
  7.   
  8.     public MyIntentService() {  
  9.         super("yyyyyyyyyyy");  
  10.     }  
  11.   
  12.     @Override  
  13.     protected void onHandleIntent(Intent intent) {  
  14.         // 经测试,IntentService里面是可以进行耗时的操作的   
  15.         //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent   
  16.         //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个   
  17.         System.out.println("onStart");  
  18.         try {  
  19.             Thread.sleep(20000);  
  20.         } catch (InterruptedException e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.         System.out.println("睡眠结束");  
  24.     }  
  25. }  

 

测试主程序:

  1. package com.zhf.service;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6.   
  7. public class ServiceDemoActivity extends Activity {  
  8.     /** Called when the activity is first created. */  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding   
  14.         //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)   
  15.         startService(new Intent(this,MyIntentService.class));  
  16.         startService(new Intent(this,MyIntentService.class));  
  17.     }  
  18. }  

 

 

杰理JL701N V142的SDK实现双备份自定义OTA教程代码分享 摘要 本文档详细介绍了基于JL701N SDK的UART OTA升级功能开发方案。该方案采用双备份(Dual Bank)机制,通过串口实现安全可靠的固件远程更新。核心特性包括:1) 双备份升级机制确保升级失败可回滚;2) CRC-16/XMODEM校验保障数据完整性;3) 灵活的传输控制,支持自定义波特率数据包大小。文档提供了完整的系统架构、API接口说明、通信协议规范以及移植指南,适用于生产烧录、现场升级等多种场景。配套Python升级工具简化了升级流程,使开发人员能够快速实现固件更新功能。 阅读详情

相关推荐

1篇1章3节:R 语言的产生发展轨迹(更新2024/08/14)

药物的研究阶段包括靶标确定、生物学模型建立、新化学实体的发现优化新化学实体四个关键环节。每个环节都在药物研发过程中发挥着至关重要的作用。通过科学严谨的方法技术手段,研究人员能够在药物研发过程中不断探索优化,从而发现开发出具有高效、安全性的候选药物,为疾病治疗提供更多的选择希望。

MD Code 2596

Service

Service定义 Service是可以长时间运行在后台的,不可见的,没有界面的组件; Service运行在主线程中; Service可以跨进程调用。 为什么使用Service service可以放在独立的进程中,更安全。 使用service可以依赖现有的binder机制不需要在应用层面上处理线程同步的繁杂工作。系统可以重新启动异常死去的service。 intentservic...

weixin_41456069的博客 331

【深度学习总结_02】在自己的数据集微调SAM

使用医疗影像数据微调SAM

qq_41234663的博客 1万+

Android中的ServiceIntentService

IntentServiceService的子类,它比普通Service增加了额外功能。 首先,Service本身存在的两个问题: 1、Service不会专门启动一条单独的进程,Service它所在应用位于同一个进程中。 2、Service也不是专门一条新的线程,因此不应该在Service中直接处理耗时的任务。 如果非要在Service中处理耗时任务,建议在Service中另外启动一条新

dln15222的博客 427

服务(Service)的停止启动

Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者内容提供者(content provider)交互,所有这些活动都是在后台进行。

lizhong 1万+

ServiceIntentService区别

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

Android司机 5455

AndroidServiceIntentService比较

稍微翻译理一理,这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程...

weixin_33704591的博客 191

android拾遗——AndroidServiceIntentService比较

不知道大家有没有我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得。 首先IntentService是继承自Service的,那我们先看看Service...

adjcqbb47379的博客 165

Android开发之ServiceIntentService比较

稍微翻译理一理,这里主要是说IntentServic 不知道大家有没有我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得。 首先IntentService是继承自

成信物联星的学习笔记 686

AndroidServiceIntentService比较

AndroidServiceIntentService比较 分类: Android2011-10-26 13:55 27921人阅读 评论(38) 收藏 举报 serviceandroidapplicationthreadasynchronousclass        不知道大家有没有我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少

BlestLee的专栏 628

AndroidServiceIntentService的使用比较

该博客来自网络——————>> 稍微翻译理一理,这里主要是说IntentServic 不知道大家有没有我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得。

sinat_30474567的博客 270

茶饮市场消费行为数据集(18特征,31894条记录)CSV

包含字段:订单编号、用户编号、城市、城市级别、品牌、商品编号、商品类型、价格、数量、订单金额、场景、性别、年龄组、会员、社交接触、动机、订单日期、年份。

原动画基础教程-动画师生存手册

由曾获奥斯卡奖的迪斯尼著名动画导演理查德•威廉姆斯编著,是一本深入解析动画绘制技巧的权威动画教材。全书深入讲解了以迪斯尼为代表的西方经典动画的创作原则、制作规律及表现技巧,是迪斯尼动画几十年制作经验表现技巧的系统总结。作者以动画人特有的诙谐、幽默的叙述方式,配合生动的插画图例,将动画绘制中的难点轻松化解,令人茅塞顿开。

上一篇: android中连续点击,Toast短暂弹出
下一篇: Guava之eventbus
奔跑的乌龟
博客等级 码龄15年 3粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值