Service和Thread到底有什么关系呢?何时应该用Service,何时又应该用Thread?答案可能会有点让你吃惊,由于Service和Thread之间没有任何关系!线程
之因此有很多人会把它们联系起来,主要就是由于Service的后台概念。Thread咱们你们都知道,是用于开启一个子线程,在这里去执行一些耗时操做就不会阻塞主线程的运行。而Service咱们最初理解的时候,总会以为它是用来处理一些后台任务的,一些比较耗时的操做也能够放在这里运行,这就会让人产生混淆了。可是,若是我告诉你Service实际上是运行在主线程里的。日志
在MainActivity的onCreate()方法里加入一行打印当前线程id的语句:进程
而后在MyService的onCreate()方法里也加入一行打印当前线程id的语句:get
如今从新运行一下程序,并点击Start Service按钮,会看到以下打印日志:it
能够看到,它们的线程id彻底是同样的,由此证明了Service确实是运行在主线程里的,也就是说若是你在Service里编写了很是耗时的代码,程序一定会出现ANR的。thread
那我要Service又有何用呢?其实你们不要把后台和子线程联系在一块儿就好了,这是两个彻底不一样的概念。Android的后台就是指,它的运行是彻底不依赖UI的。即便Activity被销毁,或者程序被关闭,只要进程还在,Service就能够继续运行。后台
Service进行后台一些耗时任务的操做怎么办?Service里也要建立一个子线程,那为何不直接在Activity里建立呢?这是由于Activity很难对Thread进行控制,当Activity被销毁以后,就没有任何其它的办法能够再从新获取到以前建立的子线程的实例。并且在一个Activity中建立的子线程,另外一个Activity没法对其进行操做。可是Service就不一样了,全部的Activity均可以与Service进行关联,而后能够很方便地操做其中的方法,即便Activity被销毁了,以后只要从新与Service创建关联,就又可以获取到原有的Service中Binder的实例。所以,使用Service来处理后台任务,Activity就能够放心地finish,彻底不须要担忧没法对后台任务进行控制的状况。程序
Service中开启线程去执行耗时任务,这样就能够有效地避免ANR的出现。还有其余方法能够防止ANR没?固然有,将一个普通的Service转换成远程Service。那么进程间通讯如何处理呢?AIDL,这就是Service和AIDL用途的缘由了。方法