@@ -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
0 commit comments