App、WMS、AMS如何通信

1. APP通过Token访问AMS,将Activity、PhoneWindow同ActivityRecord对应

AMS中的ActivityRecord有继承了Binder的Token内部类,Binder是IBiner接口的实现类。

ActivityRecord继承了WindowToken,WindowToken有类型为IBinder的成员token ; 所以ActivityRecord也继承到了IBinder的成员token

WindowToken的成员token ,在WindowToken的构造函数中被赋值。

WindowToken的构造,在ActivityRecord的构造中通过super关键字被调用,因为存在继承关系。

在ActivityRecord的构造中,new出一个其内部类Token的对象,给WindowToken的token 成员赋值。

在新建Activity的流程中,ActivityTaskSupervisor.realStartActivityLocked 会创建ClientTransaction ,进而跟应用进行交互。

ClientTransaction添加LaunchActivityItem 类型的Callback。

AMS主导被创建的Activity执行Callback:

ClientLifecycleManager.scheduleTransaction → ClientTransaction.schedule → ActivityThread.scheduleTransaction → TransactionExecutor → executeexecuteCallbacks

LaunchActivityItem.execute → ActivityThread.ActivityClientRecord.constructor → 将ActivityRecord的成员token给到应用侧的ActivityClientRecord → ActivityThread.handleLaunchActivity

performLaunchActivity →Activity.attach → Activity的成员mToken 被赋值 → PhoneWindow.setWindowManager →PhoneWindow、Window的成员mAppToken 被赋值 →

Window的成员mWindowAttributes 的成员token 会在调用adjustLayoutParamsForSubWindow 时被赋值

至此,App可以通过Token向AMS发起调用。

比如:start新Activity的时候, 旧Activity在应用进程执行onPaused后,会通过token调用AMS中的ActivityRecord.addToStopping。

ClientLifecycleManager.scheduleTransaction → ClientTransaction.schedule → ActivityThread.scheduleTransaction → TransactionExecutor → executeexecuteLifecycleState

PauseActivityItem.postExecute → ActivityClient.activityPaused →ActivityClientController.activityPaused →ActivityRecord.activityPaused → … →ActivityRecord.addToStopping

2. AMS通过ApplicationThread访问App

ActivityThread的内部类ApplicationThread ,继承IApplicationThread.Stub ,因此ActivityThread是这个Binder的服务端,客户端就是AMS

ActivityThread代表应用侧,应用进程启动时,会执行ActivityThread的main方法,进而执行ActivityThread.attach ,进而执行AMS.attachApplication

此时,AMS就可以主动向应用侧发起调用了。

AMS通过ClientTransaction 控制应用的生命周期,就是通过ActivityThread来调用应用侧。

3. VRI通过Session同WMS通信

4. WMS通过VRI的成员mWindow,将WindowState、VRI、PhoneWindow对应

AMS调用ActivityThread.handleResumeActivity →WindowManagerImpl.addView →WindowManagerGlobal.addView → ViewRootImpl.setView →Session.addToDisplayAsUser(mWindow...)

WMS.addWindow

mWindow 是VRI的成员,类型为VRI的内部类W。

WMS.addWindow ,主要完成以下几项工作:1. 新建WindowToken 2. 新建WindowState 3. 将IWindow 类型的client 放到mWindowMap 保存。

WindowTokentoken成员是Window;WindowStatemClient 是Window。

5. AMS、WMS通过ActivityRecord、WindowToken的继承关系联系起来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值