Android中的常见通信机制
1.Handler同进程的线程间通信
Handler通过sendMessage()发送Message到MessageQueue队列,Looper通过loop()不断提取出Message,并将Message交给target通过displatchMessage()分发给handlerMessage处理。
2.Binder每个应用之间的通信,即进程间通信
普通服务和基于AIDL的服务bindService
3.Android网络编程分为两种:基于http协议的,和基于socket的。
基于Http协议:HttpClient、HttpURLConnection、AsyncHttpClient框架等
基于Socket:Socket应用层和传输层之间的一种抽象
(1)针对TCP/IP的Socket、ServerSocket(流套接字)
(2)针对UDP/IP的DatagramSocket、DatagramPackage(数据报套接字)
TCP/IP协议体系结构:应用层、传输层、网络层、网络接口层
OSI模型:应用层、表示层、会话层、传输层、网络层、数据连接层、物理层
TCP协议:
三次握手:
- 第一次:客户端发送SYN包(=j)到服务器(客户端SYN_SEND状态)
- 第二次:服务器发送ACK包(=j+1),和自己的SYN包(=k)给客户端(服务器SYN_RECV状态)。
- 第三次:客户端收到服务器包,向服务器发送ACK(确认)包(=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
四次挥手:
- 客户端发送一个FIN,用来关闭客户到服务器的数据传送。
- 服务器收到后发回一个ACK,确认序号为收到的序号加1。
- 服务器关闭与客户端的连接,发送一个FIN给客户端。
- 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
SYN 同步序列号
ACK TCP 报头的控制位之一,对数据进行确认.
FIN 发送端完成发送任务位
4.Android中几种IPC(Inter-Process Communication,进程间通信)机制对比
名称 |
优点 |
缺点 |
适用场景 |
Bundle |
简单易用 |
只能传输Bundle支持的数据类型 |
组件间进程间通信 |
文件共享 |
简单易用 |
不适合并发场景,并且无法做到进程间即时通信 |
无并发访问情形,交换简单数据实时性不高的场景 |
AIDL |
功能强大,支持一对多并发通信,支持实时通信 |
需要处理好线程同步 |
一对多通信且有RPC需求 |
Message |
功能一般,支持一对多串行通信,支持实时通信 |
不能很好处理高并发场景,不支持RPC,数据通过Message进程传输,因此只能传输Bundle支持的数据类型 |
低并发的一对多即时通信,无RPC需求,或者无需要返回结果的RPC需求 |
ContentProvider |
在数据访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作 |
可以理解为受约束AIDL,主要提供数据源的CRUD操作 |
对多进程间的数据共享 |
socket |
功能强大,可以使用网络传输字节流,支持一对多并发实时通信 |
实现细节稍微有点繁琐,不支持直接RPC |
网络数据交换,或少数进程间交换 |
来源:oschina
链接:https://my.oschina.net/glfei/blog/3178127