一、Android中常用的IPC通信
- 管道
- Socket
- 共享内存
- 信号
二、管道
管道是一种IPC通信方式,分为有名管道和无名管道,无论是有名管道还是无名管道其原理都是在内核开辟一块缓存空间,这段缓存空间的操作是通过文件读写方式进行的。
管道为分半双工和全双工:
-
- 半双工:半双工管道是单向通信,进程1只能向管道写数据,进程2只能从管道读取数据。只有一个代表读或者写的FD(文件描述符)。
- 全双工:全双工管道是双向通信,有两个文件描述符,代表读和写。
有名管道与无名管道:
-
- 有名管道:有名管道的通信可以通过管道名进行通信,进程间不需要有关系。
- 无名管道:无名管道就是匿名管道,匿名管道通信的进程必须是父子进程。
半双工:
全双工:
在Linux实现pipe:
public static void main(String[] args) { int fd[2]; char buffer[SIZE]; pipe(fd); pid_t pid = fork(); if (pid == 0) { close(fd[1]); read(fd(0), buffer, SIZE); } else if (pid > 0) { close(fd[0]); write(fd[1], "Hello", 5); } }
三、Socket
Socket提供一套网络通信的接口。Socket网络IPC通信是全双工的,进程间不需要有关系。
在Android中AMS与Zygote通信采用的Socket通信。
四、共享内存
共享内存是IPC通信性能最好的方式,进程间通信只需要一次拷贝,适合进程间大数据通信。
在Android中应用的Surface与SurfaceFlinger的IPC通信采用的共享内存方式实现的。
在Android*享内存有一个工具类MemoryFile。