既然android service是运行在主线程中的,那service还有什么用?_每个线程都有一个messagequeue-程序员宅基地

技术标签: service  Android_pre  Android  

既然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 做不到的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32534441/article/details/103600947

智能推荐

gunicorn多进程不死_在Gunicorn / Flask应用程序中的进程间共享静态全局数据-程序员宅基地

文章浏览阅读353次。I have a Flask app running under Gunicorn, using the sync worker type with 20 worker processes. The app reads a lot of data on startup, which takes time and uses memory. Worse, each process loads it..._gunicorn 启动的项目无法杀死进程

android 亮度广播,Android亮度调节的几种实现方法-程序员宅基地

文章浏览阅读352次。最近在做一个App的设置项,亮度调节。真正做时,发现Android亮度调节比预想要复杂一些。其实目前网上已有不少这方面的资料,但有些博文具有一定误导性。在此将这块内容按照自己理解整理一下。整体上看,Android亮度调节分为三个层次,分别是:Android系统亮度调节、Android App亮度调节和Android当前屏幕(Window)亮度调节。1.Android系统亮度调节Android系统亮..._android 亮度变化广播

【Websocket】之 Chrome 解析 Websocket_chrome中websocker消息解析-程序员宅基地

文章浏览阅读2.3k次。文章目录一、实战(1)栗子1(2)栗子2二、分析一、实战(1)栗子1访问:http://demos.kaazing.com/jms/index.html打开两个页面,执行如下:网页A登录(点击Connect)订阅(点击Subscribe)网页B登录(点击Connect)编辑文本发送消息(点击send)网页A,如图:(2)栗子2访问:http://dem..._chrome中websocker消息解析

微信小程序swiper小程序轮播图小圆点样式修改_"<swiper class=\"swiper-box\" indicator-dots=\"{{t-程序员宅基地

文章浏览阅读527次。<swiper class="swiper-box" indicator-dots="{{ indicatordots }}" autoplay="{{ autoplay }}"> <block wx:for="{{ swiperItem }}"> <swiper-item> <navigator url="{{ item.linkUrl }}"> <image class=_"

android 代码 截取屏幕,如何以编程方式在Android上截取屏幕截图?-程序员宅基地

文章浏览阅读346次。这是允许我的屏幕截图存储在SD卡上的代码,以后用于满足您的任何需求:首先,您需要添加适当的权限来保存文件:这是代码(在Activity中运行):privatevoidtakeScreenshot(){Datenow=newDate();android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss",now);try{//i..._屏幕部分截图android代码

注册表禁用计算机管理,Win7注册表编辑器被管理员禁用的解除方法-程序员宅基地

文章浏览阅读2.7k次。熟悉Win7系统的朋友都知道,注册表编辑器是更改Win7系统设置的好工具。在注册表中可以完成控制面板中不能修改的设置。但是有些用户打开注册表编辑器的时候却被提示,注册表编辑器已被管理员禁用,这是怎么回事呢?如何解除Win7对注册表编辑器的限制呢?一、Win7打开注册表的方法1 Win+R键打开Win7系统的运行,在运行数输入regedit点击确定。二、注册表被禁用解除方法Win7注册表编辑器被管理..._注册表编辑器禁用和解除原因

随便推点

python dataframe切片_python pandas dataframe 行列选择,切片操作方法-程序员宅基地

文章浏览阅读914次。SQL中的select是根据列的名称来选取;Pandas则更为灵活,不但可根据列名称选取,还可以根据列所在的position(数字,在第几行第几列,注意pandas行列的position是从0开始)选取。相关函数如下:1)loc,基于列label,可选取特定行(根据行index);2)iloc,基于行/列的position;3)at,根据指定行index及列label,快速定位DataFrame的..._python 对dataframe使用切片或loc等运算按行或列进行拆分,得到多个dataframe结构

php串口调试,【TQi.MX6UL体验】串口调试代码-程序员宅基地

文章浏览阅读134次。天嵌TQi.MX6UL开发板具有很多的输入输出接口,合理使用它们能使它强大的功能得以发挥在硬件上,接上串口1在软件上,如下述代码所示://使用板子上的串口 1 作为调试串口,将串口 1 设置为系统标准输出。chosen {stdout-path = &uart1;};//配置属性,将串口 1 的设置为”okay”打开模式&uart1 {pinctrl-names = "defaul..._mx6ul_pad_uart1_tx_data__uart1_dce_tx

fastapi 大型应用_FastApi项目实战 - 爱投票管理系统(一)-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏14次。一、闲来无事,在工作之余自己研究了一下python的异步框架 - fastapi,并写包括1、部门管理2、角色管理3、用户管理4、菜单管理5、登录日志6、操作日志7、添加反爬机制六个基础功能模块,演示链接:https://www.lovevote.cn, 账号:admin,密码:admin由于我的电脑问题,下载的vue依赖包有几个发生了版本冲突,打包部署后偶尔会在点击菜单按钮时发生前端延时(这时表..._fastapi开发大型项目

java 泛式_JAVA如何在类中使用ParameterizedType获取泛式类型-程序员宅基地

文章浏览阅读108次。在类中使用ParameterizedType获取类的实体类的泛式类有以下代码:public class Demo<T> {private Class<T> clazz;public T getDemo() throws InstantiationException, IllegalAccessException{return clazz.newInstance();}pub..._java parameterizedtype 类型

python3中的编码_encoded = binascii.b2a_base64(s, newline=false) ty-程序员宅基地

文章浏览阅读621次。python2字符串编码存在的问题:使用 ASCII 码作为默认编码方式,对中文处理不友好把字符串分为 unicode 和 str 两种类型,误导开发者将unicode作为唯一内码python3中默认编码方式修改为utf-8。在存储和显示上,python3使用文本字符和二进制数据进行区分,更加明确和清晰。文本字符使用str类型表示,str 能表示 Unicode 字符集中所有字符,..._encoded = binascii.b2a_base64(s, newline=false) typeerror: a bytes-like obje

计算机目录创建后只有sid号,重装Oracle时出现SID已存在问题的解决办法-程序员宅基地

文章浏览阅读294次。注意安装oracle服务器的环境,不稳定导致数据库出现问题,后果很严重!方法如下:1、开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。2、 开始->程序->Oracle - OraHome81->Oracle Installation Products-> Universal Installer 卸装所有Oracle产品,但Universal Installer本身不能被删..._oracle 系统标识符sid 已经存在