九州编程
对于Android,每一个进程都有一个主线程,四大组件的处理任务都是在这个线程中进行的。每个线程都有一个MessageQueue,里面用于存放Message,四大组件的处理工作是用Message来封装的。可以说Android应用层是消息驱动的。你的想法可能是,Service长期在后台工作,如果它是运行在主线程中的话,那么岂不是会一直阻塞主线程?当然会。如果你在Service的初始化方法中,比如onCreate、onStartCommand、onBind开启死循环,系统自然就ANR了。原因是,Service里执行的代码,也是一个Message封装的,如果一直在执行这个Message,那么后面其他组件的消息就得不到执行了,自然会ANR[有兴趣可以看一下检测ANR的原理]。所以一般Service我们会开启子线程来执行任务。总结一下,四大组件就是碰到什么任务了,就会封装一个Message,然后扔到MessageQueue里等待这个消息被执行。对于Activity,其onCreate、onStart一系列初始化合在一起,其实也是一个任务。所以说Android应用层是消息驱动的。所以Service和Thread又有什么区别?不同之处,楼上也说了,由于其四大组件的特性,这个任务不容易被杀。这符合了它的特性:长期地在后台执行任务。相同之处,都会开启子线程,如果CPU的核心数的工作线程饱和后,会争抢时间片。