背景

在了解了Service的基本概念和分类之后,我们再从其他的方面了解了解Servie。

Service和Thread的区别

  • Service运行在主线程,Thread运行在工作线程。
  • Service完全不依赖UI/Activity,只要进程还在,Service就可以继续运行,Thread在Activity中运行,依赖于某个Activity。
  • 所有的Activity都可与Service关联,获得Service实例并且操做其中的方法,在一个Activity中创建子线程,另一个Activity无法对其进行操作。
  • 如果需要做耗时处理,需要在Service里创建Thread子线程执行,Activity很难控制Thread,并且Activity被销毁之后,无法再获取之前创建的子线程实例。

Service和IntentService的区别

在了解他们的区别之前我们需要了解到什么几个概念,ANR的含义?IntentService是什么?为什么要使用IntentService?

ANR(Application Not Responding),应用程序无响应

NNR一般有三种类型

  • KeyDispatchTimeout(5 seconds)–>主要类型:按键或触摸事件在特定时间内无响应。
  • BroadcastTimeout(10 seconds)—> BroadcastReceiver在特定时间内无法处理完成。
  • ServiceTimeout(20 seconds)—>小概率类型:Service在特定时间内无法处理完成。
什么是IntentService

IntnetService是继承并处理异步请求的一个类。

IntentService是继承Service的,它包含了Service的全部特性(也包含生命周期),不同的是IntentService在执行onCreate操作时,内部开了一个线程去执行耗时操作。

IntentService是一个通过Context.startService(Intent)启动,可以去处理异步请求的Service,使用时只需要继承IntentService和重写其中的onHandleIntent(Intent)方法接收一个Intent对象,工作完成后就会自动停止服务,所有的请求处理都在一个工作线程中完成,它们会交替执行(不会阻塞主线程的执行),一次只能执行一个请求。

为什么要使用IntentService

Service是用于后台服务的,保证程序挂在后台时某些组件仍然能正常工作,然而Service不是独立的进程,是默认运行在主线程中的,所以如果直接在服务里去处理一些耗时的逻辑,就容易出现ANR的情况。

所以这个时候就需要用到Android多线程编程的技术了,我们可以在服务内开启线程,采用Thread+Handler方式处理耗时操作,但服务一旦启动,就会一直处于运行状态,必须调用stopSelf()/stopService()才能让服务停止。这样使用编写逻辑较为复杂,可选择IntentService来操作。

特点
  • 会创建独立的worker线程来处理所有的Intent请求。
  • 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题。
  • 所有请求处理完成之后,IntentService会自动停止,无需调用stopSelf()方法停止Service。
  • 可以启动IntentService多次,每一个耗时操作会以工作队列的方式在IntentService的onHandIntent回调方法中执行,并且每次执行都只会执行一个工作线程,执行完一个再执行第二个,以此类推。他本质就是一个封装了HandlerThread+Handler的异步框架。