Android Token机制:Activity与Window的身份与归属

404 阅读2分钟

Android Token机制:Activity与Window的身份与归属


一、Activity Token:身份的唯一标识

在 Android 系统中,ActivityToken 是其在**ActivityManagerService(AMS)** 中的唯一身份标识。

  • 身份标识:每个 Activity 启动时,AMS 都会为其创建一个 ActivityRecord 实体,并生成一个唯一的 IBinder 对象作为其 Token
  • 生命周期管理:AMS 通过 Token 来管理 Activity 的生命周期。当 Activity 被销毁时,AMS 会使用 Token 来识别并清理其所有相关资源。
  • Binder 代理Activity 进程中的 Activity 实例持有这个 Token 的 Binder 代理。它通过这个 Token,向 AMS 发送生命周期回调(如 ActivityManager.activityResumed())。

二、Window Token:窗口的归属与安全凭证

WindowToken 是其在 WindowManagerService(WMS) 中的归属证明。

  • 归属证明WindowToken 通常指向其所属 ActivityToken。这使得 WMS 能够将 Window 与其父 Activity 关联起来,从而实现窗口的层级管理。
  • 层级管理WMS 根据 Token 来确定窗口的 Z-Order 层级。例如,一个 Dialog 窗口的 Token 与其父 ActivityToken 相同,WMS 会将 Dialog 显示在 Activity 窗口之上。
  • 安全控制WMS 会验证 Token 的合法性。如果一个 WindowToken 无效,WMS 会拒绝其显示,从而防止恶意应用创建非法窗口。

三、Token的协同工作流程

Activity TokenWindow Token 共同构成了 Android 界面系统的安全与生命周期管理机制。

  1. Activity 创建AMS 创建 ActivityRecord,并为其生成一个 ActivityToken
  2. Activity 绑定AMSActivityToken 发送给 Activity 进程,Activity 实例持有该 Token
  3. Window 创建:当 Activity 创建 Window 时,它会将自己的 ActivityToken 传递给 Window
  4. Window 注册Window 在被添加到 WindowManagerService 时,会附带其 Token
  5. 生命周期同步:当 Activity 销毁时,AMS 会通知 WMSWMS 随后通过 ActivityToken 找到所有关联的 Window,并将其全部移除。

四、常见问题与底层原理

1. Dialog 必须传 Activity Context

  • 本质原因:为了获取 ActivityTokenDialog 作为一个子窗口,需要一个合法的 Token 来证明其归属。ActivityContext 中包含了 ActivityToken 信息,而 ApplicationContext 则不包含。

2. Token 的本质

  • Token 的本质是一个 IBinder 对象。IBinder 是 Android Binder 框架的基石,它使得 Activity 进程(客户端)和 WindowManagerService 进程(服务端)能够进行跨进程通信。

3. Token 泄露的风险

  • 内存泄漏:如果一个 Token 没有被及时释放,它所关联的 Activity 窗口可能无法被回收,导致内存泄漏。
  • 安全风险:如果一个恶意应用窃取了某个 Token,它可能创建假的窗口,进行钓鱼或界面劫持。