图解Service的两种启动方式

图解Service的两种启动方式

众所周知,Service有两种启动方式
在这里插入图片描述

.
.
.

一.在新进程启动Service

在新进程启动Service共分为5个步骤:

step1:

App向AMS发送一个启动Service的消息,从AIDL视角看是这个样子的:
service
图中client代表了App端,APP通过AMN/AMP将要启动的service信息发送给了AMS。

Step2:

AMS检查Service是否在Manifest中声明了,没声明会直接报错。

AMS检查启动Service的进程是否存在,如果不存在,先把Service信息存下来,然后创建一个新的进程。

在AMS中,每个Service,都使用ServiceRecord对象来保存。

Step3:

新进程启动后,也会创建新的ActivityThread,然后把ActivityThread对象通过AMP传递给AMS,告诉AMS,新进程启动成功了。

Step4:

AMS把传进来的ActivityThread对象改造为ApplicationThreadProxy,也就是ATP,通过ATP,把要启动的Service信息发送给新进程。

Step5:

新进程通过ApplicationThread接收到AMS的信息,和前面介绍的启动Activity的最后一步相同,借助于ActivityThread和H,执行Service的onCreate方法。在此期间,为Service创建了Context上下文对象,并与Service相关联。
在这里插入图片描述
这里的H与Activity启动过程中的H是同一个Handler类…到这里在新进程中启动service成功了
.
.
.

二.在当前进程中启动Service

相比上面的过程,在当前进程启动Service就简单多了:
1.App向AMS请求启动Service

2.AMS例行检查,比如Service是否声明了,把Service在AMS这边注册。AMS发现要启动的Service就是App所在的Service,就通知App启动这个Service。

3…Service启动成功
.
.

三.在当前进程绑定新启动的Service

Step1.APP向AMS请求绑定Service

Step2.AMS例行检查,比如Service是否声明了,把Service在AMS这边注册。AMS发现要启动的Service就是App所在的Service,就通知App对Service进行绑定。

Step3.App收到AMS的第一个消息,启动Service

Step4.App收到AMS第二条消息,绑定service,并将一个binder传给AMS

Step5.AMS收到binder后,将其发送给APP

Step6.APP收到binder对象,Service启动成功

Step1:
在这里插入图片描述
step5,6:
在这里插入图片描述
图片是自己画的,地址是:ProcessOn

四.IntentSerivice与Service的区别

首先我们清楚,Service虽然叫做后台服务,但是Service中却并不可以做耗时操作,否则会出现ANR异常。
所以多数情况下我们只能不断的在service中开辟线程,利用新的新线程去做 耗时操作。但这样做的缺点就是服务会在后台一直运行,想要停止只能手动调用stopService()方法,或者stopself()方法。于是Android给我们提供了IntentService。

IntentService的特点:

  1. IntentService内部有一个工作线程,专门用来处理耗时操作,所以我们不需要在IntentService中去开辟线程。
  2. IntentService当任务完成后,会自己停止。
  3. IntentService 维护了一个工作队列。所以我们可以多次启动IntentService ,它会将每个耗时操作存放在工作队列中,然后再IntentService 的 onHandleIntent 回调方法中执行,每次只会有一个工作线程去处理耗时操作,执行完之后再执行下一个
  4. IntentService的启动方式与普通Service相同

本文参考:
https://www.jianshu.com/p/058d35e01dd1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 HTML 盒子模型代码以及两种标准的盒模型的图解: ```html <!DOCTYPE html> <html> <head> <title>盒子模型示例</title> <style> /* 标准盒模型 */ .standard { width: 200px; height: 100px; padding: 20px; border: 1px solid #000; margin: 10px; } /* IE 盒模型 */ .ie { width: 200px; height: 100px; padding: 20px; border: 1px solid #000; margin: 10px; box-sizing: border-box; /* 设置为 IE 盒模型 */ } </style> </head> <body> <h2>标准盒模型</h2> <div class="standard">这是一个标准盒模型</div> <h2>IE 盒模型</h2> <div class="ie">这是一个 IE 盒模型</div> </body> </html> ``` 标准盒模型和 IE 盒模型的图解分别如下: 标准盒模型: ``` +-------------+ | content | | | +-------------+ | padding | | | +-------------+ | border | | | +-------------+ | margin | | | +-------------+ ``` IE 盒模型: ``` +-------------+ | border | | | +-------------+ | padding | | | +-------------+ | content | | | +-------------+ | margin | | | +-------------+ ``` 两种盒模型的区别在于它们计算元素的宽度和高度的方式不同。标准盒模型的宽度和高度只包括内容区域,而 IE 盒模型的宽度和高度包括了内容区域、内边距和边框。在标准盒模型下,如果想要增加元素的宽度和高度,需要同时增加内边距和边框的宽度;而在 IE 盒模型下,增加元素的宽度和高度只需要改变内容区域的大小即可,内边距和边框的宽度不会影响整个元素的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值