IntentService和Service的比较

2024-05-12 11:18

本文主要是介绍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. e使用队列的方式将请求的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. } 


 

这篇关于IntentService和Service的比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982475

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

UserWarning: mkl-service package failed to import

安装完成anaconda,并设置了两个环境变量  之后再控制台运行python环境,输入import numpy as np,提示错误 D:\InstallFolder\Anaconda3\lib\site-packages\numpy\__init__.py:143: UserWarning: mkl-service package failed to import, therefore

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

研究生生涯中一些比较重要的网址

Mali GPU相关: 1.http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/ 2.http://malideveloper.arm.com/resources/tools/arm-development-studio-5/ 3.https://www.khronos.org/opengles/sdk/do

性能测试工具 wrk,ab,locust,Jmeter 压测结果比较

前言 在开发服务端软件时,经常需要进行性能测试,一般我采用手写性能测试代码的方式进行测试,那有什么现成的好的性能测试工具吗? 性能测试工具 wrk,ab,locust,Jmeter 压测结果比较 详见: 性能测试工具 wrk,ab,locust,Jmeter 压测结果比较 Jmeter性能测试 入门

MongoDB学习—(6)MongoDB的find查询比较符

首先,先通过以下函数向BookList集合中插入10000条数据 function insertN(obj,n){var i=0;while(i<n){obj.insert({id:i,name:"bookNumber"+i,publishTime:i+2000})i++;}}var BookList=db.getCollection("BookList")调用函数,这样,BookList

jdbc连接数据库使用sid和service_name的区别 ?

问题描述: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was: 10.12.162.84:1521:xxxx  oracle数据的tnsnames.ora中配置的是:SERVICE

超声波清洗机哪个品牌比较好一点的?清洁力强的超声波清洗机品牌

随着生活水平的不断提升和幸福感的增强,珠宝、饰品和眼镜等物品已成为许多家庭的常备之物。然而,这些贵重细小的物件易于积聚微尘与隐形细菌,长此以往可能悄悄影响家人的健康,毕竟细菌是肉眼难以察觉的隐患。超声波清洗机应运而生,它以高科技手段有效地解决了这一隐忧,深层清洁,守护家人免受微小污染物的潜在威胁。不过现在市面上超声波清洗机品牌挺多的,究竟有哪些品牌的超声波清洗机比较好一点呢?接下来就为大家带来四款

【JavaScript】版本号和日期时间的比较

JS使用 ‘>’ 运算符比较两个字符串大小时,会把字符串转换为ASCII码依次比较。 比较标准时间格式可以直接使用 ’ > ’ 比较; (2018-07-20格式)