您的位置:首页 > 移动开发 > Android开发

Android之service和thread的区别

2016-06-22 23:50 351 查看

service和thread的区别,何时用service,何时用thread?



Service android的一种机制,是四大组件之一。

按服务性质分local service和remote service

当它运行的时候如果是Local Service,那么对应的 Service是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的,如果此时你在Service里编写了非常耗时的代码,程序必定会出现ANR的!

当它运行的时候如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

按启动方式分bindService和startedService 

其中bindService更类似于客户端和服务端,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息。

那么Service和Thread到底什么联系,为什么很多人都容易混淆二者?

之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。

其实Service和Thread根本就不是一个级别的东西,Service是系统的四大组件之一,Thread只是一个用来执行后台任务的工具类,由当前程序托管,而service托管于系统的servicemanager。这样做的目的是因为Thread独立于activity,一旦activity结束,该线程也不一定会执行完成,而此时你不再持有该thread的引用,你无法在控制他了。而且我们有的时候也需要多个不同的activity控制一个服务。这些thread都不能实现,所以我们引进service。 

总结:

       Service是系统的四大组件之一,Thread只是一个用来执行后台任务的工具类

Service可以设置独立的进程;Thread不可以,只能存在于进程中。

Service有自己的生命周期。如果是以bind的方式启动,生命周期跟activity相同。如果是以start方式启动,不调用stop会一直运行在后台;Thread运行完了就结束了,启动后跟activity没有关系了,哪怕activity结束了,thread也会在后台运行。

不同的Activity可以调用同一个Service;不同的Activity不能调用同一个Thread。

Service如果是运行在后台的,可以注册接收系统或自定义广播;Thread不能接收广播

不同的应用程序可以共享同一Service,但不能共享同一Thread。

service中可以创建thread,避免ANR。

Thread在后台运行(Activty stop)的优先级低于后台运行的Service,如果执行系统资源紧张,会优先杀死前一种,后台运行的Service一般情况下不会被杀死,如果被杀死,系统空闲时会重新启动service.




什么时候用Service,什么时候用多线程?

从逻辑上你认为需要一个后台操作,但跟我们现在主线程操作通讯频繁,逻辑关系紧密,就用多线程(直接用)

比如你要下载图片,然后在当前activity上显示,那就用多线程

能够从逻辑上区分开来,又或者耗时较长,就用后台服务

比如下载电影就用service,这样即使来电话了,也不影响下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: