Android应用程序窗口(Activity)的绘图表面(Surface)的创建流程

每一个在C++层实现的应用程序窗口都需要有一个绘图表面,然后才可以将自己的UI表现出来。这个绘图表面是需要由应用程序进程请求SurfaceFlinger服务来创建的,在SurfaceFlinger服务内部使用一个Layer对象来描述。  对于在Java层实现的Android应用程序窗口来说,它也需要请求SurfaceFlinger服务为它创建绘图表面,这个绘图表面使用一个Surface对象来描述。在Java层实现的Android应用程序窗口的绘图表面是通过两个Surface对象来描述,一个是在应用程序进程这一侧创建的,另一个是在WindowManagerService服务这一侧创建的,它们对应于SurfaceFlinger服务这一侧的同一个Layer对象。在应用程序进程这一侧,每一个应用程序窗口,即每一个Activity组件,都有一个关联的Surface对象,这个Surface对象是保在在一个关联的ViewRoot对象的成员变量mSurface中的。

在应用程序进程这一侧,每一个Java层的Surface对都对应有一个C++层的Surface对象,并且后者的地址值保存在前者的成员变量mNativeSurface中。

在WindowManagerService服务这一侧,每一个应用程序窗口,即每一个Activity组件,都有一个对应的WindowState对象,这个WindowState对象的成员变量mSurface同样是指向了一个Surface对象。

在WindowManagerService服务这一侧,每一个Java层的Surface对都对应有一个C++层的SurfaceControl对象,并且后者的地址值保存在前者的成员变量mSurfaceControl中

ActivityThread.handleLaunchActivity()
             ↓
ActivityThread.handleResumeActivity()
             ↓
WindowManagerImpl.addView()
             ↓
WindowManagerGlobal.addView()
             ↓
ViewRootImpl.setView()
             ↓
ViewRootImpl.requestLayout()
             ↓
ViewRootImpl.scheduleTraversals
             ↓
ViewRootImpl.doTraversal()
             ↓
ViewRootImpl.performTraversals()
             ↓
ViewRootImpl.relayoutWindow()
             ↓
Session.relayout()
             ↓
WindowManagerService.relayoutWindow()
             ↓
WindowStateAnimator.createSurfaceLocked()
             ↓
new SurfaceControl()
             ↓
android_view_SurfaceControl.nativeCreate()
             ↓
sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj)) //这个client 其实就是在创建WindowState对象过程中,创建的SurfaceComposerClient,这里只是把它找到,用来创建下面的surface。(Java层的SurfaceSession对象有一个成员变量mClient,它指向了在C++层中的一个SurfaceComposerClient对象,C++层的SurfaceComposerClient对象可以用来请求SurfaceFlinger服务为应用程序窗口创建绘图表面,即创建一个Layer对象)
sp<SurfaceControl> surface = client->createSurface()
             ↓
至此,这个Surface 会保存在ViewRootImpl 的 mSurface 变量中

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值