cover: http://q9j7c7ivg.bkt.clouddn.com/2020-05-03-15884369035725.png
tags:
- 源码
- Window
categories: - [Android, 系统]
流程图
(大体流程,从Activity接受启动开始)

源码分析
基于API 23
Window创建
ActivityThread.handleLaunchActivity
ActivityThread.performLaunchActivity
ActivityThread处理并执行Activity启动
1 | //ActivityThread |
Activity.attach
- 构造PhoneWindow (Window唯一具体实现)
- 设置自身为Window的Callback,从而Activity能作为callback接受window的key和touch事件
- 初始化且设置WindowManager,每个Activity对应一个WindowManager,通过WM与WMS进行通信
1 | final void attach(...) { |
Window添加View过程
前面在handleLauncherActivity完成了PhoneWindow的创建过程,下面我们继续查看Activity执行生命周期handleResumeActivity方法,查看Activity对应View被加载到PhoneWindow容器过程
ActivityThread.handleResumeActivity
- 获取ActivityClientRecord,将对应DecorView设置为不可见,因为当前View还未绘制
- 通过Window对应的WindowManager执行addView(decor,l)操作
- View绘制完成后,会将decorView设置可见,展示该Activity对应内容,最后onResume完成
1 | final void handleResumeActivity(IBinder token, |
WindowManagerImply.addView
WindowManagerGlobal.addView
- WindowManagerImpl的全局变量通过单例模式初始化了WindowManagerGlobal,(一个进程一个WMG对象)
- Window管理类添加View过程,创建ViewRootImpl,将View处理操作交给ViewRootImpl实现
1 | // WindowManagerImply |
ViewRootImpl.setView
- ViewRootImpl构建过程中,会通过WindowManagerGlobal的getWindowSession(static方法)获取IWindowSession即WindowSession
- 执行requestLayout方法完成View的绘制流程
- 通过WindowSession与WindowManagerService通信,将View和InputChannel添加到WMS,从而展示View并可以接受输入事件
1 |
|
WindowSession.addToDisplay
- Session执行addToDisplay方法,通过调用成员变量WMS进行addWindow操作
1 | public int addToDisplay(...) { |
WindowManagerService.addWindow
- 创建WindowState,保存Window状态
- 调整LayoutParams参数、设置input、设置window zOrder
- 执行WindowState的attach(创建Surface过程,详情见下一篇)
1 | public int addWindow(Session session, IWindow client, int seq, |
推荐阅读:图形系统总结
参考
Android Window 机制探索
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment