深入剖析Android中Service和Thread区别
service既不是进程也不是线程,它们之间的关系如下:
可能有的朋友会问了,既然是长耗时的操作,那么thread也可以完成啊。没错,在程序里面很多耗时工作我们也可以通过thread来完成,那么还需要service干嘛呢。接下来就为大家解释以下service和thread的区别。
首先要说明的是,进程是系统最小资源分配单位,而线程是则是最小的执行单位,线程需要的资源通过它所在的进程获取。
service与thread的区别:
thread:thread 是程序执行的最小单元,可以用 thread 来执行一些异步的操作。
service:service 是android的一种机制,当它运行的时候如果是local service,那么对应的 service 是运行在主进程的 main 线程上的。如果是remote service,那么对应的 service 则是运行在独立进程的 main 线程上。
thread 的运行是独立的,也就是说当一个 activity 被 finish 之后,如果没有主动停止 thread 或者 thread 里的 run 方法没有执行完毕的话,thread 也会一直执行。因此这里会出现一个问题:当 activity 被 finish 之后,不再持有该 thread 的引用,也就是不能再控制该thread。另一方面,没有办法在不同的 activity 中对同一 thread 进行控制。
例如:如果 一个thread 需要每隔一段时间连接服务器校验数据,该thread需要在后台一直运行。这时候如果创建该thread的activity被结束了而该thread没有停止,那么将没有办法再控制该thread,除非kill掉该程序的进程。这时候如果创建并启动一个 service ,在 service 里面创建、运行并控制该 thread,这样便解决了该问题(因为任何 activity 都可以控制同一个service,而系统也只会创建一个对应 service 的实例)。
因此可以把 service 想象成一种消息服务,可以在任何有 context 的地方调用 context.startservice、context.stopservice、context.bindservice、context.unbindservice来控制它,也可以在 service 里注册 broadcastreceiver,通过发送 broadcast 来达到控制的目的,这些都是 thread 做不到的。
不少android初学者都可能会有这样的疑惑,service和thread到底有什么关系呢?什么时候应该用service,什么时候又应该用thread?答案可能会有点让你吃惊,因为service和thread之间没有任何关系!
之所以有不少人会把它们联系起来,主要就是因为service的后台概念。thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。但是,如果我告诉你service其实是运行在主线程里的,你还会觉得它和thread有什么关系吗?让我们看一下这个残酷的事实吧。
在mainactivity的oncreate()方法里加入一行打印当前线程id的语句:
log.d("myservice", "mainactivity thread id is " + thread.currentthread().getid());
然后在myservice的oncreate()方法里也加入一行打印当前线程id的语句:
log.d("myservice", "myservice thread id is " + thread.currentthread().getid());
现在重新运行一下程序,并点击start service按钮,会看到如下打印日志:
可以看到,它们的线程id完全是一样的,由此证实了service确实是运行在主线程里的,也就是说如果你在service里编写了非常耗时的代码,程序必定会出现anr的。
你可能会惊呼,这不是坑爹么!?那我要service又有何用呢?其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。android的后台就是指,它的运行是完全不依赖ui的。即使activity被销毁,或者程序被关闭,只要进程还在,service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用service来实现。你可能又会问,前面不是刚刚验证过service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。
额,既然在service里也要创建一个子线程,那为什么不直接在activity里创建呢?这是因为activity很难对thread进行控制,当activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个activity中创建的子线程,另一个activity无法对其进行操作。但是service就不同了,所有的activity都可以与service进行关联,然后可以很方便地操作其中的方法,即使activity被销毁了,之后只要重新与service建立关联,就又能够获取到原有的service中binder的实例。因此,使用service来处理后台任务,activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。
以上就是小编为大家带来的深入剖析android中service和thread区别的全部内容了,希望对大家有所帮助,多多支持~
下一篇: CI框架常用函数封装实例