android intentService详解

来源:互联网 发布:wps是啥软件 编辑:程序博客网 时间:2024/06/11 20:06

转自:http://blog.csdn.net/ryantang03/article/details/8146154

在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Activity是同级的,所以,要执行耗时任务,就得在Service里面开子线程来执行。那么,有没有一种简单的方法来处理这个过程呢,答案就是IntentService。


什么是IntentService,首先看看官方的解释:

IntentService is a base class forServices that handle asynchronous requests (expressed asIntents) 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



简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

还有一个说明是:

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.

大致意思是:所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。

那么,用IntentService有什么好处呢?首先,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service,第三,it's so easy to use!



ok,接下来让我们来看看如何使用,我写了一个Demo来模拟两个耗时操作,Operation1与Operation2,先执行1,2必须等1执行完才能执行:

新建工程,新建一个继承IntentService的类,我这里是IntentServiceDemo.java

[java] view plaincopy
  1. public class IntentServiceDemo extends IntentService {  
  2.   
  3.     public IntentServiceDemo() {  
  4.         //必须实现父类的构造方法  
  5.         super("IntentServiceDemo");  
  6.     }  
  7.       
  8.     @Override  
  9.     public IBinder onBind(Intent intent) {  
  10.         System.out.println("onBind");  
  11.         return super.onBind(intent);  
  12.     }  
  13.   
  14.   
  15.     @Override  
  16.     public void onCreate() {  
  17.         System.out.println("onCreate");  
  18.         super.onCreate();  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onStart(Intent intent, int startId) {  
  23.         System.out.println("onStart");  
  24.         super.onStart(intent, startId);  
  25.     }  
  26.   
  27.   
  28.     @Override  
  29.     public int onStartCommand(Intent intent, int flags, int startId) {  
  30.         System.out.println("onStartCommand");  
  31.         return super.onStartCommand(intent, flags, startId);  
  32.     }  
  33.   
  34.   
  35.     @Override  
  36.     public void setIntentRedelivery(boolean enabled) {  
  37.         super.setIntentRedelivery(enabled);  
  38.         System.out.println("setIntentRedelivery");  
  39.     }  
  40.   
  41.     @Override  
  42.     protected void onHandleIntent(Intent intent) {  
  43.         //Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务  
  44.         String action = intent.getExtras().getString("param");  
  45.         if (action.equals("oper1")) {  
  46.             System.out.println("Operation1");  
  47.         }else if (action.equals("oper2")) {  
  48.             System.out.println("Operation2");  
  49.         }  
  50.           
  51.         try {  
  52.             Thread.sleep(2000);  
  53.         } catch (InterruptedException e) {  
  54.             e.printStackTrace();  
  55.         }  
  56.     }  
  57.   
  58.     @Override  
  59.     public void onDestroy() {  
  60.         System.out.println("onDestroy");  
  61.         super.onDestroy();  
  62.     }  
  63.   
  64. }  

我把生命周期方法全打印出来了,待会我们来看看它执行的过程是怎样的。接下来是Activity,在Activity中来启动IntentService:

[java] view plaincopy
  1. public class TestActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.           
  8.         //可以启动多次,每启动一次,就会新建一个work thread,但IntentService的实例始终只有一个  
  9.         //Operation 1  
  10.         Intent startServiceIntent = new Intent("com.test.intentservice");  
  11.         Bundle bundle = new Bundle();  
  12.         bundle.putString("param""oper1");  
  13.         startServiceIntent.putExtras(bundle);  
  14.         startService(startServiceIntent);  
  15.           
  16.         //Operation 2  
  17.         Intent startServiceIntent2 = new Intent("com.test.intentservice");  
  18.         Bundle bundle2 = new Bundle();  
  19.         bundle2.putString("param""oper2");  
  20.         startServiceIntent2.putExtras(bundle2);  
  21.         startService(startServiceIntent2);  
  22.     }  
  23. }  

最后,别忘了配置Service,因为它继承于Service,所以,它还是一个Service,一定要配置,否则是不起作用的,开始我就是忘了,结果半天没反应。

[html] view plaincopy
  1. <service android:name=".IntentServiceDemo">  
  2.             <intent-filter >  
  3.                 <action android:name="com.test.intentservice"/>  
  4.             </intent-filter>  
  5.         </service>  

ok,最后来看看执行结果:


从结果可以看到,onCreate方法只执行了一次,而onStartCommand和onStart方法执行了两次,开启了两个Work Thread,这就证实了之前所说的,启动多次,但IntentService的实例只有一个,这跟传统的Service是一样的。Operation1也是先于Operation2打印,并且我让两个操作间停顿了2s,最后是onDestroy销毁了IntentService。


这就是IntentService,一个方便我们处理业务流程的类,它是一个Service,但是比Service更智能。希望本文对大家有用,有任何建议或想法欢迎留言和我交流。

Demo源码下载


对Android&IOS感兴趣的朋友可以加入我们的讨论QQ群,在这里,我们只讨论干货:

iOS群:220223507

Android群:282552849


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机没声音显示耳机模式怎么办 华为手机没声音出现耳机模式怎么办 安卓手机全民k歌耳返延迟怎么办 华为手机双清后手机开不了机怎么办 荣耀9上面有个耳机标志怎么办 华为p9耳机有一个没有声音怎么办 小米5c手机gps信号弱怎么办 华为8手机时常听常音乐声怎么办 手机用久了变慢了怎么办 免税店买的皮带太短了怎么办 小米手机自拍照片是反的怎么办 华为p20旅行助手被删了怎么办 假如手机点击一个链接是病毒怎么办 华为手机自带铃声没了怎么办 华为手机升级后铃声没了怎么办 华为平板电脑激活锁忘记了怎么办 华为手机不小心删了系统应用怎么办 华为畅想6s开机键坏了怎么办 浏览网页是进入有病毒的网页怎么办 华为荣耀7清理加速那么慢怎么办 华为手机自带天气卸载了怎么办 手机被病毒感染了开不了机了怎么办 小米手机系统桌面已停止运行怎么办 三星手机应用锁密码忘了怎么办 手机管家应用加密密码忘记了怎么办 下载东西呗安全管家制止了该怎么办 手机百度时不小心中毒扣话费怎么办 手机扫二维码中了木马病毒要怎么办 电脑管家微信扫描语音打不开怎么办 遇到花心老公又爱玩没有担当怎么办 软件全闪退返回键不管用了怎么办 为什么下载了我的世界打不开怎么办 问道手游安全锁忘记了怎么办 电脑显示网络电缆没有插好怎么办 手机扣扣的密码忘记了怎么办 扣扣忘记密码和密保怎么办 以前用的扣扣密码忘记了怎么办 我忘记扣扣支付密码了怎么办 百度云盘下载后怎么打不开怎么办 节奏大师领钻石卡丢了怎么办? 节奏大师体力赠送关了打不开怎么办