
面试题:IPC(跨进程通信)
某些模块因特殊原因要运行在单独进程中。 为加大一个应用可使用的内存,需通过多进程来获取多份内存空间。 当前应用需要向其它应用获取数据。
静态成员和单例模式失效:多进程环境下,静态变量和单例模式无法保证唯一性。 线程同步机制失效:多个进程的并发访问可能导致竞态条件和死锁。 SharedPreferences可靠性下降:多进程环境下,SharedPreferences的读写可能不一致。 Application多次创建:多进程模式下,Application可能被多次创建,导致资源管理困难。
Messenger:基于Binder实现,适用于服务化交互。 AIDL(Android Interface Definition Language):基于Binder,用于跨进程接口定义。 ContentProvider:通过共享内容进行数据交互。 Socket:通过网络 socket 进行通信。 安全性:Android系统为每个进程分配唯一的UID和PID,防止恶意进程间通信。 效率:Binder机制仅需一次数据拷贝,相比Socket的两次拷贝更高效。 可扩展性:Binder架构清晰,便于扩展和定制。
客户端获取服务端代理:客户端进程通过Binder驱动获取服务端进程的代理。 发送请求:客户端调用代理接口方法,发送请求数据。 处理请求:代理将请求通过Binder驱动发送到服务端进程。 返回结果:服务端处理完成后,通过Binder驱动将结果返回给客户端代理。 结果传递:代理将处理结果反馈给客户端进程。
客户端(Client):请求服务端进程的接口方法。 服务端(Server):实现接口方法,处理客户端请求。 ServiceManager:管理服务注册和发现,向客户端提供服务接口。
Messenger:通过Binder实现进程间通信。 AIDL:定义跨进程接口,通过Binder通信。 ContentProvider:通过Binder机制共享数据内容。
服务端注册:服务端进程将接口方法注册到ServiceManager。 客户端获取代理:客户端进程通过ServiceManager获取服务端代理。 调用接口:客户端调用代理接口方法,传递数据。 分层设计:合理分层模块,避免接口过于庞大。 减少接口数量:避免重复接口定义,优化代码维护。 使用Parcel化:通过Parcel对象传输大数据,提高效率。 线程管理:确保UI线程和子线程的数据传输同步。
发布日期:2021-05-14 18:01:21
浏览次数:18
分类:精选文章
本文共 2600 字,大约阅读时间需要 8 分钟。
Q1:IPC基础及概念?
IPC(Inter-Process Communication,跨进程通信)是指两个或多个进程之间进行数据交换的过程。在操作系统中,进程间通信是实现多任务处理的重要机制。每个操作系统都有自己的IPC机制,例如:
- Windows:通过剪切板、管道、油槽等进行进程间通讯。
- Linux:通过命名空间、共享内容、信号量等进行进程间通讯。
- Android:虽然基于Linux,但独具特色的通讯方式有Binder、Socket等。
IPC的使用场景:
Android的进程架构:
Android系统的进程架构设计具有以下优点:
- 稳定性和安全性高:每个进程拥有独立的虚拟地址空间,防止其他进程访问内存,进程崩溃不会影响整个系统。
- 便于复用与管理:内核共享有助于系统维护和并发操作,节省内核空间。
Q2:Android中进程和线程的关系?区别?
进程(Process)与线程(Thread):
- 进程:一个执行单元,通常指一个程序或应用。
- 线程:CPU调度的最小单元,系统资源的有限使用。
两者关系:
- 一个进程可以包含多个线程,例如一个应用程序可以同时执行多个任务。
- 主线程(UI线程):负责处理用户界面操作。
- 子线程:用于耗时操作,避免在主线程中进行。
Q3:为何需要进行IPC?多进程通信可能会出现什么问题?
为何需要IPC:
- 多进程模式:为了解决内存不足问题,Android允许在同一个应用内创建多个进程,分担主进程的压力。
- 跨进程通信:不同进程之间需要安全、高效地传输数据。
多进程通信可能出现的问题:
Q4:Android中IPC方式有几种? 为何新增Binder来作为主要的IPC方式?
Android中的IPC方式:
Android系统提供了多种IPC方式,包括:
为什么选择Binder:
Binder通信过程:
Binder机制的组成:
Q7:Android中有哪些基于Binder的IPC方式?简单对比下?
基于Binder的IPC方式:
对比:
方式 | 操作机制 | 优点 | 缺点 |
---|---|---|---|
Messenger | 基于接口调用 | 高效、灵活 | 开销较高,不适合频繁调用 |
AIDL | 基于接口定义 | 强类型化,安全性高 | 开发复杂度较高 |
ContentProvider | 共享数据内容 | 方便数据交互 | 适用场景有限 |
Q8:是否了解AIDL?原理是什么?如何优化多模块都使用AIDL的情况?
AIDL(Android Interface Definition Language):
AIDL是一种基于Binder的跨进程接口定义语言,用于定义服务与客户端之间的接口。其原理是:
优化多模块使用AIDL:
Q9:什么是序列化?Serializable接口和Parcelable接口的区别?为何推荐使用后者?
序列化:
序列化是将对象的状态转换为可以传输或存储的格式,便于数据交互。
Serializable与Parcelable的区别:
使用方式:
- Serializable:只能通过默认的readObject()和writeObject()方法进行序列化。
- Parcelable:需要实现writeToParcel()和readFromParcel()方法,提供更大的控制权。
性能:
- Serializable:数据转换为字符串,性能较差。
- Parcelable:数据转换为 Parcelable对象,性能更高。
适用场景:
- Serializable:适用于需要频繁序列化和反序列化的场景。
- Parcelable:推荐用于需要高效传输和反序列化的场景。
为何推荐Parcelable:
- 性能更优:Parcelable的数据传输效率更高。
- 控制更强:可以自定义序列化和反序列化逻辑。
- 适合跨进程通信:在Binder通信中,Parcelable是首选方式。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月17日 17时38分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
重置UAG Application admin密码
2019-03-12
Horizon Daas租户管理平台扩展分配时报:内部错误
2019-03-12
vcenter访问报503错误处理
2019-03-12
项目计划甘特图绘制说明
2019-03-12
09.QT应用程序启动外部exe文件
2019-03-12
1009. clion调试段错误
2019-03-12
C/C++:线性表之顺序表
2019-03-12
嵌入式系统试题库(CSU)
2019-03-12
图神经网络7日打卡营学习心得
2019-03-12
electronJS 开发linux App
2019-03-12
MbedOS 设备中的模数转换(ADC)
2019-03-12
【vue】setInterval的嵌套实例
2019-03-12
【SpringBoot】如何配置热部署
2019-03-12
【rabbitMQ】04 如何实现高可用?
2019-03-12
【自考】之信息资源管理(一)
2019-03-12
C# 文本框限制大全
2019-03-12
setup facatory9.0打包详细教程(含静默安装和卸载)
2019-03-12
ionic4 路由跳转传值
2019-03-12
CSDN 怎么写出好看的博客
2019-03-12