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

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,