Android系统的内部通信方式

        在进程间通信方面,Linux有管道、消息队列、共享内存、套接字、信号量、信号这些IPC机制。Android额外还有Binder IPC机制,Android OS中的Zygote进程的IPC采用的是Socket机制,在上层system server、media server以及上层App之间更多的是采用Binder IPC方式来完成跨进程间的通信。本文主要介绍Binder IPC、Socket以及Handler通信方式

        在线程通信方面,对于Android上层架构中,很多时候是在同一个进程的线程之间需要相互通信,例如同一个进程的主线程与工作线程之间的通信,往往采用的Handler消息机制。

1、Binder IPC

        Binder通信采用c/s架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。 在Android framework层中,应用层通过获取binder对象来实现与service的通信,framework层和native层的通信方式也是通过binder实现的,可以将binder理解为一个携带通信信息的对象,比如在framework层,它由service创建,APP层的进程想要与service实现通信就必须获取这个对应的binder对象。由于binder的机制比较复杂,详细的记录将在其他文章中展开。

Binder通信架构图(图源网络):

 

 

2、Socket通信

Socket通信,即套接字通信。在Android中用到Socket通信的主要有以下:

Zygeto孵化进程:用于孵化所有Java进程,framework层的system server进程就是通过Zygeto孵化生成的,system server创建进程时是通过Socket向Zygeto进程发起请求的。

installed:用于安装APP的守护进程,上层的packagemanagerservice的很多实现都是交给他完成的。

lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;

adbd:用于服务adb的进程;

logcatd: 用于服务logcat;

vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。

3、Handler线程通信

Android线程之间的通信方式主要基于handler机制,在APP进程中,主要分为主线程和其他线程,其他线程和主线程具有依附关系,一些耗时操作需要交给子线程去执行,这就必然涉及到线程之间的通信。

为什么需要handler?

主要是为了实现异步回调机制,或者说线程之间的通信,为了避免ANR,常需要把一些耗时的线程放到子线程去执行,当子线程需要修改UI时就通知主线程进行修改。

主线程和子线程都要有一个looper对象,不同的是主线程的looper是在UI线程启动的时候就创建了的,子线程的looper对象需要手动创建。一个主线程可以通过handler关联多个子线程,但是他们都是公用同一个looper对象。Handler机制的核心组件时looper、handler、messagequeue。
 

handler的工作原理图:

 

                                           主线程视角下的handler机制工作流程图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值