首先IntentService是继承自Service的,那咱们先看看Service的官方介绍,这里列出两点比较重要的地方: java
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. android
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). 面试
稍微翻一下(英文水平通常) express
1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。 app
2.Service不是一个线程,因此咱们应该避免在Service里面进行耗时的操做 less
关于第二点我想说下,不知道不少网上的文章都把耗时的操做直接放在Service的onStart方法中,并且没有强调这样会出现Application Not Responding!但愿个人文章能帮你们认清这个误区(Service不是一个线程,不能直接处理耗时的操做)。 异步
有人确定会问,那么为何我不直接用Thread而要用Service呢?关于这个,你们能够网上搜搜,这里不过多解释。有一点须要强调,若是有耗时操做在Service里,就必须开启一个单独的线程来处理!!!这点必定要铭记在心。 async
IntentService相对于Service来讲,有几个很是有用的优势,首先咱们看看官方文档的说明: ide
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. oop
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.
1.Service:
package com.zhf.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); //经测试,Service里面是不能进行耗时的操做的,必需要手动开启一个工做线程来处理耗时操做 System.out.println("onStart"); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("睡眠结束"); } @Override public IBinder onBind(Intent intent) { return null; } }
package com.zhf.service; import android.app.IntentService; import android.content.Intent; public class MyIntentService extends IntentService { public MyIntentService() { super("yyyyyyyyyyy"); } @Override protected void onHandleIntent(Intent intent) { // 经测试,IntentService里面是能够进行耗时的操做的 //IntentService使用队列的方式将请求的Intent加入队列,而后开启一个worker thread(线程)来处理队列中的Intent //对于异步的startService请求,IntentService会处理完成一个以后再处理第二个 System.out.println("onStart"); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("睡眠结束"); } }
测试主程序: