3 回答
TA贡献1785条经验 获得超4个赞
对于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的核心数的工作线程饱和后,会争抢时间片。
TA贡献1866条经验 获得超5个赞
service是使程序后台运行的保证,例如音乐播放软件会在离开程序窗口的时候继续播放,这时候就是service在起作用,service通常会提供借口(播放暂停,下一曲),保证程序后台运行
- 3 回答
- 0 关注
- 2276 浏览
添加回答
举报