IntentService和Service的比较

来源:互联网 发布:搜索引擎与数据库 编辑:程序博客网 时间:2024/05/12 09:42
首先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. } 


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在厂里做管理被员工恐吓怎么办 在葡京娱乐输了很多钱怎么办 从珠海入镜澳门北京往返签注怎么办 艾艾灸灸了一身小子子怎么办? 微信视频已过期或已清理怎么办 视频已过期或已被清理怎么办 小孩作业不会老婆天天吵骂打怎么办 苹果手机在太阳下屏幕变暗怎么办 斗鱼的鱼丸竞猜主播结算了怎么办 附近有个小姐姐想加她好友怎么办 孩子出现听别人说话语速很快怎么办 苹果手机上的邮件删了怎么办 手机qq邮箱独立密码忘记了怎么办 哺乳期吃了人参回奶了怎么办? 扣扣邮箱里的邮件过期了怎么办 一体机的管理员账号被删除了怎么办 手机里的邮箱重要吗删除了怎么办 华为荣耀10账号邮箱忘记了怎么办 大陆微信号在台湾登录不上怎么办 威纶触摸屏被禁止到反编译了怎么办 微信公众号邮箱被占用怎么办 京东绑定的手机号不用了怎么办 绑定微信的手机号不用了怎么办 绑定支付宝的手机号不用了怎么办 百度账号手机号换了密码忘了怎么办 换手机好了华为账号密码忘了怎么办 苹果手机忘了id账号和密码怎么办 金立手机账号密码忘了怎么办 乐视手机账号密码忘了怎么办 企业邮箱发出去邮件撤不回来怎么办 餐厅加热保温设备零线带电怎么办 小米手机不小心把照片删了怎么办 华为手机不小心把照片删了怎么办 网易邮箱被改成别人的姓名怎么办 苹果手机忘记id密码和邮箱怎么办 163邮箱下载的附件没有了怎么办 小米自带浏览器打开网页太慢怎么办 再歪一点授权码忘记了怎么办 注册支付宝的手机号不用了怎么办 手机号被别人注册了支付宝怎么办 支付宝账号密码都忘了怎么办