按服务性质分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只是一个用来执行后台任务的工具类

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

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

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

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

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

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

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


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

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

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

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

比如下载电影就用service,这样即使来电话了,也不影响下载

service和thread的区别,何时用service,何时用thread?相关推荐

  1. Service 与 Thread 的区别

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

  2. Android复习10【Service与Thread的区别、Service的生命周期、Service生命周期解析(相关方法详解、启动方式的不同、绑定)、音乐播放器+服务】

    音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目   录 Service与Thread的区别 Service的生命周期 Service生命周 ...

  3. 知识点干货--聊一聊Android中Service与Thread的区别

    古语说得好:"一寸光阴一寸金,寸金难买寸光阴."一寸光阴和一寸长的黄金一样昂贵,而一寸长的黄金却难以买到一寸光阴.比喻时间十分宝贵.此语句出自唐朝王贞白的<白鹿洞二首> ...

  4. android Service oncreate 在UI线程 何时用service,何时用thread

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 服务的生命周期 各个方法 都是在主线程中的. 这里的操作可以导致主线程阻塞. 这些方法, ...

  5. Spring中的@ Component,@ Repository和@Service批注有什么区别?

    @Repository @Component , @Repository和@Service批注可以在Spring中互换使用吗,或者除了充当注解设备外,它们还提供任何特定功能吗? 换句话说,如果我有一个 ...

  6. Spring注解的使用步骤,@Component注解创建的对象名称,常用注解Component、Repository、Service以及Controller的区别

    1. 注解的使用 1.1 pom.xml文件加入spring-context依赖,间接加入了spring-aop依赖,有aop依赖才能使用注解 1.2 在spring配置文件中加入组件扫描器标签< ...

  7. angularjs 中 Factory,Service,Provider 之间的区别

    本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...

  8. service mysqld restart与service mysql restart的区别

    1.前言 之前,遇到过在不同 linux 系统中启动或关闭 mysql,网上查询命令大都不一样,大致分为下面三种(以重启为例): service mysql restartservice mysqld ...

  9. service mysql restart 和service mysqld restart 的区别

    service mysql restart 和service mysqld restart 的区别不是由于mysql版本的原因,而是配置的原因. mysql自带一个服务脚本,位置再MySQL的安装目录 ...

  10. service和doXX方法区别、Http请求头案例、获取请求的传递参数

    一.service和doXX方法区别: 1.注意:tomcat服务器首先会调用servlet的service方法,然后在service方法中再根据请求方式来分别调用对应的doXX方法. 2.例如,如果 ...

最新文章

  1. 《 线性代数及其应用 (原书第4版)》—— 2.3 可逆矩阵的特征
  2. Android AIDL示例-回调方法版
  3. android studio导出apk步骤
  4. 为 hexo 博客添加本地搜索功能
  5. 方法练习3_打印指定次数的HelloWorld
  6. YBTOJ洛谷P2223:软件开发(费用流)
  7. 线程安全和对应的核心概念
  8. 软件工程(总体设计②设计原理)
  9. 团购“罗生门”渐退行业舞台 千团大战仍需企业自律
  10. Java 内存溢出(java.lang.OutOfMemoryError)解决
  11. MySQL安装和修改密码
  12. 【PIL】Image中blend的简单使用
  13. 点击触发ajax重复提交表单,屡次连续点击致使Ajax重复提交
  14. matlab双线性插值双三次插值对CUFED5进行处理
  15. 数据库和表的基本操作
  16. 简单易懂逆矩阵,终于明白矩阵的逆到底有什么用
  17. 局域网内配置Outlook 2007支持收发Domino 8.5邮箱
  18. 杜甫写的有关风雨的古诗有哪些
  19. 浅尝辄止MongoDB:基础
  20. if_salv_gui_table_ida 实现 CDS VIEW ALV

热门文章

  1. Windows核心编程 第三章 内核对象
  2. UVA11997求前k个和,多路归并问题
  3. hdu1914 稳定婚姻问题
  4. 浮点数 IEEE表示 舍入 运算
  5. 【Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )
  6. 【数字信号处理】傅里叶变换性质 ( 序列对称分解定理示例 | 共轭对称序列与原序列之间的关系 | 共轭反对称序列与原序列之间的关系 )
  7. 【C 语言】数组 ( 多维数组本质 | n 维数组名称本质 是 n-1 级数组指针 )
  8. CPU调度(CPU Scheduling)
  9. HDU 4445 Crazy Tank --枚举
  10. 可以由指令直接指定的I/O端口数(一共256个,从0到255一共256个端口号)