Android Token机制:Activity与Window的身份与归属
一、Activity Token:身份的唯一标识
在 Android 系统中,Activity 的 Token 是其在**ActivityManagerService(AMS)** 中的唯一身份标识。
- 身份标识:每个
Activity启动时,AMS 都会为其创建一个ActivityRecord实体,并生成一个唯一的IBinder对象作为其Token。 - 生命周期管理:AMS 通过
Token来管理Activity的生命周期。当Activity被销毁时,AMS 会使用Token来识别并清理其所有相关资源。 - Binder 代理:
Activity进程中的Activity实例持有这个Token的 Binder 代理。它通过这个Token,向AMS发送生命周期回调(如ActivityManager.activityResumed())。
二、Window Token:窗口的归属与安全凭证
Window 的 Token 是其在 WindowManagerService(WMS) 中的归属证明。
- 归属证明:
Window的Token通常指向其所属Activity的Token。这使得WMS能够将Window与其父Activity关联起来,从而实现窗口的层级管理。 - 层级管理:
WMS根据Token来确定窗口的 Z-Order 层级。例如,一个Dialog窗口的Token与其父Activity的Token相同,WMS会将Dialog显示在Activity窗口之上。 - 安全控制:
WMS会验证Token的合法性。如果一个Window的Token无效,WMS会拒绝其显示,从而防止恶意应用创建非法窗口。
三、Token的协同工作流程
Activity Token 和 Window Token 共同构成了 Android 界面系统的安全与生命周期管理机制。
Activity创建:AMS创建ActivityRecord,并为其生成一个ActivityToken。Activity绑定:AMS将ActivityToken发送给Activity进程,Activity实例持有该Token。Window创建:当Activity创建Window时,它会将自己的ActivityToken传递给Window。Window注册:Window在被添加到WindowManagerService时,会附带其Token。- 生命周期同步:当
Activity销毁时,AMS会通知WMS,WMS随后通过ActivityToken找到所有关联的Window,并将其全部移除。
四、常见问题与底层原理
1. Dialog 必须传 Activity Context?
- 本质原因:为了获取
Activity的Token。Dialog作为一个子窗口,需要一个合法的Token来证明其归属。Activity的Context中包含了Activity的Token信息,而Application的Context则不包含。
2. Token 的本质
Token的本质是一个IBinder对象。IBinder是 Android Binder 框架的基石,它使得Activity进程(客户端)和WindowManagerService进程(服务端)能够进行跨进程通信。
3. Token 泄露的风险
- 内存泄漏:如果一个
Token没有被及时释放,它所关联的Activity窗口可能无法被回收,导致内存泄漏。 - 安全风险:如果一个恶意应用窃取了某个
Token,它可能创建假的窗口,进行钓鱼或界面劫持。