在 Android 开发面试或晋升考核中,Handler 和 Binder 机制是高频考点。许多开发者倾向于临时背诵八股文,但在实际工作中,深入理解底层原理才是决定技术高度的关键。市场需求已从单纯掌握 API 转向要求开发者深入了解工作原理和实现细节。
一、Handler 线程间通信机制
1. Handler 与 Looper 的关系
一个线程通常只有一个 Looper,而可以有多个 Handler。Handler 通过 Looper 获取 MessageQueue 进行消息处理。主线程在启动时会自动创建 Looper,子线程则需要手动调用 Looper.prepare() 和 Looper.loop()。
2. 内存泄漏问题
Handler 作为内部类持有外部 Activity 的引用。如果 Handler 生命周期长于 Activity,且未移除回调,会导致 Activity 无法回收。解决方案是使用 WeakReference 或在 onDestroy 中 removeCallbacksAndMessages(null)。
3. 消息队列处理
当消息队列为空时,Looper 会进入阻塞状态等待新消息。这保证了线程不会空转,同时确保消息按顺序处理。在子线程中维护 Looper 需要特别注意线程的生命周期管理。
二、Binder 进程间通信架构
1. Binder 基础
Binder 是 Android 特有的 IPC 机制,相比传统的 Socket 或 AIDL,它支持跨进程对象传递,具有高性能和安全性。Binder 驱动负责内核层的传输,ServiceManager 负责服务注册与查找。
2. AIDL 与 Messenger
AIDL (Android Interface Definition Language) 用于定义接口,编译生成 Stub 和 Proxy 类。Messenger 基于 Handler 实现,适合轻量级通信,但性能低于 AIDL。服务端回调需通过 IBinder 接口实现。
3. 常见面试题解析
- Service 的生命周期与绑定方式。
- Binder 线程池的大小限制。
- 如何获取系统服务的 IBinder 实例。
三、Android 系统启动流程
1. Init 进程与 Zygote
系统启动始于 Init 进程,解析 init.rc 配置文件。Zygote 进程负责预加载核心库并 fork 出应用进程,这是 Android 启动优化的关键。
2. SystemServer 启动
SystemServer 启动后初始化 AMS、WMS 等核心服务,这些服务运行在独立进程中并通过 Binder 相互通信。
四、核心框架服务源码解析
1. ActivityManagerService (AMS)
AMS 管理所有应用程序的生命周期。其架构涉及 ActivityStackSupervisor 和 TaskRecord。系统启动系列流程包括 BootAnimation 结束后的服务拉起。
2. WindowManagerService (WMS)
WMS 负责窗口管理和布局。绘制原理涉及 SurfaceFlinger 的合成。角色与实例化过程涉及 InputFilter 和 Policy。
3. Surface 与 SurfaceFlinger
Surface 是硬件缓冲区的抽象。双缓冲机制减少撕裂。SurfaceView 解析涉及 ViewRootImpl 与原生窗口的交互。SurfaceFlinger 负责图层合成,VSync 信号同步刷新率。
4. PackageManagerService (PKMS)
PKMS 管理应用安装与权限。APK 扫描涉及资源解析和签名验证。静默安装需特殊权限。requestPermissions 流程涉及用户授权对话框的触发。
5. InputManagerService
输入事件从 InputReader 读取,经 InputDispatcher 分发到目标 Window。处理流程涉及触摸、按键及多指手势识别。


