既然android service是运行在主线程中的,那service还有什么用?

既然android service是运行在主线程中的,那service还有什么用?

对于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的核心数的工作线程饱和后,会争抢时间片。


service作用能够为你运行的任务添加优先级。优先级别,依次减弱。前台进程,可视进程,次要服务进程,后台进程,内容供应节点,空进程。还可以做远程服务(AIDL)




阅读:
https://blog.csdn.net/qq_41123894/article/details/100182627

Service 与 Thread 的区别

很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下。

1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。

2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是RemoteService,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!

既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。

你可能感兴趣的:(Android,Android_pre)