博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android之Service与IntentService的比较
阅读量:6501 次
发布时间:2019-06-24

本文共 3900 字,大约阅读时间需要 13 分钟。

 

       不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用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:

[java] 
  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:

[java] 
  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. }  

测试主程序:

[java] 
  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. }  

转载于:https://www.cnblogs.com/wuwa/p/6191604.html

你可能感兴趣的文章
matlab建立桌面图标,在ubuntu16.04上创建matlab的快捷方式(实现方法)
查看>>
matlab 识别率,【caffe-Windows】识别率批量输出——matlab实现
查看>>
MATLAB里面的mghglobal函数,Matlab讨论区 - 声振论坛 - 振动,动力学,声学,信号处理,故障诊断 - Powered by Discuz!...
查看>>
smarty使用php代码,笑谈配置,使用Smarty技术_php
查看>>
oracle数据实际值限制,c# – Oracle数据库TNS密钥“数据源”的值长度超过了’128’的限制...
查看>>
silk v3 decoder php,解码转换QQ微信的SILK v3编码音频为MP3或其他格式
查看>>
延时关机命令 linux,windows定时关机和linux定时关机的方法(shutdown命令)
查看>>
linux内核最早延迟,工作队列是实现延迟的新机制,从2.5版本Linux内核开始提
查看>>
linux的操作命令文档,Linux文档操作命令
查看>>
linux不能访问80端口,lunux开放80端口(本地访问不了linux文件可能是这个原因)...
查看>>
linux查看与开启sshd服务,[转载]linux查看与开启sshd服务
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
html绝对定位重叠,HTML_firefox下绝对定位元素重叠造成不可点击问题,重构地图网站过程中碰到的,f - phpStudy...
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
html显示服务器状态,显示服务器时间并一直显示(html代码)
查看>>
在线html代码优化,网站seo优化html代码方法
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
在html中哪一个不是链接的目标属性,HTML试题
查看>>
android otg 挂载流程,android USB OTG功能如何打开及实现
查看>>
html属性board,pin_board.html
查看>>