Android APP/AMS/WMS之间交互总结

5,961 阅读2分钟

注:以下内容基于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在三方的唯一凭证。