本文共 1317 字,大约阅读时间需要 4 分钟。
注:以下内容基于Android API Version 27(Android 8.1)Linux Kernel 3.18.0
AMS/WMS/APP角色概述
AMS
掌管着所有App进程的启动,App四大组件的启动,App之间及App内部页面之间切换和各种组件的生命周期,AMS不控制窗口的显示,只控制各种组件的创建和运行。
WMS
掌管着所有App窗口的层叠计算。WMS被App用来显示自己的窗口,但WMS自己不具备显示能力,WMS只负责综合系统中所有的窗口,计算出叠放顺序和显示区域,然后将窗口信息交给SurfaceFliner,由SurfaceFlinger执行真正的窗口合成和显示。
WMS作为App和SurfaceFlinger的桥梁,将SufaceFlinger为窗口创建的Suface交给App,由App在Surface上进行绘制。
WMS同时为App和input系统牵线搭桥,为事件派发创建通道,将通道的一端链接在input系统另一端交给App,WMS将窗口的焦点信息和位置大小信息交给input系统,以便input系统确定事件的派发目标。
App
App负责四大组件真正的创建和相应生命周期的调用。
App用WMS返回给它的Suface进行绘图,然后通知SurfaceFlinger进行图像合成,App不直接控制Surface的大小和位置,而是通知WMS进行控制,App只管在Surface上绘图。
App、AMS和WMS之间的交互
App进程和AMS
App进程启动的时候将一个实现了IApplicationThread的binder对象交给AMS,以后AMS就用这个IApplicationThread调用App的功能,AMS启动Activity时会为Activity创建一个唯一的token(实现了IApplicationToken的binder对象),将这个token对象交给App进程。
AMS和WMS
AMS最先收到启动Activity的消息,为Activity创建token后将token添加到WMS的一个map中。(AMS和WMS在同一个进程所以可以直接调用)
App进程和WMS
App进程收到AMS启动Activity的调用后创建Activity,然后调用WMS添加和显示窗口。App会为Activity创建一个实现了IWindow的binder对象,将这个binder对象传给WMS,以便WMS检测到App窗口需要调整大小或者焦点时通知App,App同时会将AMS创建的Activity的 token传给WMS,WMS通过传来的token确认之前AMS添加过同样的token,然后为窗口创建WindowState将IWindow和token等信息保存起来。
总结
App通过IActivityManager调用AMS,AMS通过IApplicationThread调用App。
App通过IWindowManager调用WMS,WMS通过IWindow调用App。
IApplicationToken由AMS创建,同时保存于AMS、WMS和App进程,作为一个Activity在三方的唯一凭证。
转载地址:http://oqajx.baihongyu.com/