Skip to content

Commit 0e9d94d

Browse files
committed
update
1 parent 7fcfca2 commit 0e9d94d

File tree

3 files changed

+54
-10
lines changed

3 files changed

+54
-10
lines changed

OperatingSystem/AndroidKernal/Framework/ReadMe.md

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,16 +177,38 @@ Activity、Service和Application这三种类型的Context都是可以通用的
177177

178178
本章主要讲除了Activity之外的应用组件相关问题,包括service的启动和绑定原理,静态广播和动态广播的注册和收发原理,provider的启动和数据传输原理等等。
179179
##### 1 说说service的启动原理
180-
181-
##### 2 说说service的绑定原理-1
182-
183-
##### 3 说说service的绑定原理-2
184-
185-
##### 4 说说动态广播的注册和收发原理
186-
187-
##### 5 说说静态广播的注册和收发原理
188-
189-
##### 6 说说Provider的启动原理
180+
Service的启动方式主要是:startService、bindService。
181+
+ binderService和startService的区别:
182+
binderService不会触发应用端的onStartCommand函数。
183+
###### startService的流程
184+
流程分为两部分:AMS端、应用端。
185+
+ AMS的流程:
186+
+ 1). 先看Service启动了没有:如果启动了就直接发指令,让应用端执行onStartCommand()。
187+
+ 2). 如果Service没有启动,就看它所在进程启动了没有:如果已经启动,就去启动Service,等Service启动了之后再发送指令让其执行onStartCommand。
188+
+ 3). 如果进程没有启动就去启动进程,等进程启动后再启动Service。
189+
190+
+ 应用端的流程:
191+
+ 1). 先创建Service对象
192+
+ 2). 再赋予上下文
193+
+ 3). 最后调用生命周期onCreate()
194+
![](./imgs/service_start.png)
195+
###### bindService的流程
196+
+ 用向AMS发起bindService调用。
197+
+ AMS首先检查有没有Service的binder句柄,如果有就直接把它回调给应用。
198+
+ 如果没有,AMS就会向Service请求binder句柄。
199+
+ Service收到之后就会把自己的binder句柄发布到AMS。
200+
+ AMS再把这个binder句柄回调给应用。
201+
+ 应用拿到这个binder句柄后就可以向Service发起binder调用了。
202+
![](./imgs/service_binder.png)
203+
204+
###### 参考资料 [《Service启动原理》](https://www.cnblogs.com/renhui/p/12964554.html)
205+
##### 2 说说service的绑定原理
206+
207+
##### 3 说说动态广播的注册和收发原理
208+
209+
##### 4 说说静态广播的注册和收发原理
210+
211+
##### 5 说说Provider的启动原理
190212

191213
#### 第5章 UI体系相关问题
192214

@@ -207,6 +229,28 @@ Activity、Service和Application这三种类型的Context都是可以通用的
207229

208230
本章主要讲进程通信相关问题,包括binder的整体架构和通信原理,oneway机制,binder对象的传递等等。
209231
##### 1 Android Framework用到了哪些跨进程通信方式
232+
跨进程通信主要有以下几类:管道、Socket、共享内存、信号。
233+
+ 管道
234+
管道的特点是半双工&单向的,管道里面的数据只能往一个方向流动。一般情况下管道是在父子进程之间使用的。
235+
236+
+ socket
237+
socket的特点是全双工,即可读也可写。可以用在两个无亲缘关系的进程之间,但需要公开路径。
238+
例子:在Android的Framework机制中,zygote就是通过socket来接受AMS的请求,然后启动应用进程的。
239+
240+
+ 共享内存
241+
共享内存的特点:速度快,且不需要多次拷贝,且进程之间不需要存在亲缘关系,只需要拿到文件描述符即可。
242+
这里补充一下:管道和socket的问题在于数据不能太大,否则性能会非常糟糕,相比较共享内存不存在这个问题。
243+
244+
+ 信号
245+
信号的特点是:
246+
+ a).单向的,发送出去后不管其他人接受者是如何处理的;
247+
+ b).只能带信号,不能带其他参数。
248+
+ c).知道进程的pid就可以发信号,而且一次可以一群进程发信号(需 root权限 或 同uid 才行)。
249+
例子:Android的Process#killProcess方法,就是发送的 SIGNAL_KILL 信号。
250+
251+
+ Binder
252+
Binder机制是Android特有的进程间通信的机制,特点为:采用C/S的通信模式、有更好的传输性能,最重要的特点是安全。
253+
Android的四大组件,有时候不同的组件之间所在的进程是不一样的,当处于不同的进程的时候,就需要进行进程间通信了。这些进程间的通信依赖于Binder IPC机制。不仅如此,Android 系统对应用层提供的服务如:AMS、PMS等都是基于Binder IPC机制实现的。Binder机制在Android系统中的位置非常重要。
210254

211255
##### 2 谈谈你对Binder的理解
212256

91 KB
Loading
153 KB
Loading

0 commit comments

Comments
 (0)