1、WMS
- WMS主要功能
- 窗口管理:WMS负责整个系统窗口的启动、添加、删除工作,系统中每个程序的显示都由WMS管理
- 窗口动画管理:WMS负责窗口添加或切换时动画效果的执行
- 窗口输入管理:WMS负责对窗口的触摸事件进行反馈和处理
- Surface管理:每个Window都有对应的Surface负责窗口的显示,而WMS负责所有Surface的管理调度
- WMS属性介绍
public class WindowManagerService extends IWindowManager.Stub
implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {
final WindowManagerPolicy mPolicy;
final ArraySet<Session> mSessions = new ArraySet<>();
final WindowHashMap mWindowMap = new WindowHashMap();
final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<>();
final H mH = new H();
final WindowAnimator mAnimator;
final InputManagerService mInputManager;
final IActivityManager mActivityManager;
}
- mPolicy:WindowManagerPolicy的实例,WindowManagerPolicy是窗口管理策略的接口类,它的具体实现类为PhoneWindowManager
- mSessions:ArraySet对象,保存元素类型为Session,主要用于应用程序与WMS间的进程通信,每个应用程序对应一个Session,WMS内部保存这些Session,用来记录所有像WMS提出窗口服务的客户端
- mWindowMap:WindowHashMap对象,它内部以IBinder为Key,WindowState为Value,所以mWindowMap中保存着WMS中所有窗口的集合,而WindowState中保存着每个窗口的所有信息;
- mFinishedStarting:ArrayList对象,内部保存着已经启动窗口的WindowToken,WindowToken为窗口令牌,当程序像WMS申请创建Window时需要出具Token,程序中的每个Activity对应一个AppWindowToken(WindowToken的子类),WindowToken会将统一Actiivty的窗口组合在一起进行管理;
- mAnimator:WindowAnimator的对象,用于窗口的动画管理
- mH:H的实例,负责将任务添加到主线程中
- mInputManager:InputManagerService对象负责输入系统的管理,对窗口的触摸事件反馈和处理
- mActivityManager:内部保存AMS的对象
2、创建过程
由Android进程的启动过程知道,程序会同过JNI调用ZygiteInit.main()进入Java层,在main()方法中完成启动工作,其中重要的一步就是调用startSystemServer()启动系统服务,WMS就是其中一个系统服务,startSystemServer()使用反射最终调用SystemServer.main()方法(本文源码参照Android P),
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
mSystemServiceManager = new SystemServiceManager(mSystemContext);
startBootstrapServices();
startCoreServices();
startOtherServices();
}
在main方法中直接调用SystemService的run(),在run中首先创建SystemServiceManager对象,然后利用SystemServiceManager分别启动引导服务、核心服务、其他服务,WMS的启动就在startOtherServices()过程中;
- startOtherServices()
inputManager = new InputManagerService(context);
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm, false<