Android6.0 WMS(二) WMS创建窗口与创建Surface的关系

转载: https://blog.csdn.net/kc58236582/article/details/53514632

在上篇博客我们知道ViewRootImpl的setView函数会调用WindowSession的addToDisplay函数,这个函数通过Binder最终会调用WMS的addWindow函数,增加窗口。在http://blog.csdn.net/kc58236582/article/details/52413871博客中WindowState的创建过程那节中有详细分析,当然这部分主要是围绕Surface创建,另一篇博客http://blog.csdn.net/kc58236582/article/details/52088224中讲解了窗口的建立,次序等等。

这篇博客我们把之前两篇博客简单结合起来,分析Surface创建的relayoutWindow函数和addWindow的联系等。


一、addWindow函数

我们知道在ViewRootImpl的setView函数中,是先调用了requestLayout函数,然后调用了mWindowSession.addToDisplay函数,但是requestLayout最后消息机制handler最后调用relayoutWindow函数,在这个函数中调用了mWindowSession.relayout函数,最后再到WMS的relayoutWindow函数的。这样其实在ViewRootImpl的requestLayout中调用WMS的relayoutWindow是一个异步过程,所以先调用了WMS的addWindow函数。

addWindow的主要逻辑我们在http://blog.csdn.net/kc58236582/article/details/52413871博客中都分析了,这里主要讲下WindowState的创建,在WindowState的构造函数中我们也会新建一个WindowStateAnimator对象

        mWinAnimator = new WindowStateAnimator(this);
  
  

新建完WindowState对象后,会调用其attach函数


  
  
  1. void attach() {
  2. if (WindowManagerService.localLOGV) Slog.v(
  3. TAG, "Attaching " + this + " token=" + mToken
  4. + ", list=" + mToken.windows);
  5. mSession.windowAddedLocked();
  6. }

Session的windowAddedLocked函数会创建SurfaceSession对象


  
  
  1. void windowAddedLocked() {
  2. if (mSurfaceSession == null) {
  3. if (WindowManagerService.localLOGV) Slog.v(
  4. WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession");
  5. mSurfaceSession = new SurfaceSession();
  6. if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
  7. WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession);
  8. mService.mSessions.add( this);
  9. if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
  10. mService.dispatchNewAnimatorScaleLocked( this);
  11. }
  12. }
  13. mNumWindow++;
  14. }
而这个SurfaceSession的构造函数调用会调用nativeCreate JNI函数,这个函数我们不看了会创建一个和SurfaceFlinger连接的对象。这个我们在博客 http://blog.csdn.net/kc58236582/article/details/52413871也分析过了。

  
  
  1. public SurfaceSession() {
  2. mNativeClient = nativeCreate();
  3. }

最后我们会把这个WindowState放在mWindowMap这个map中。

mWindowMap.put(client.asBinder(), win);
  
  

二、relayoutWindow函数

relayoutWindow函数上来,直接调用windowForClientLocked函数查找WindowState对象

            WindowState win = windowForClientLocked(session, client, false);
  
  

这个函数就是从mWindowMap来查找WindowState对象,是根据应用共的IBinder对象来查询的。


  
  
  1. final WindowState windowForClientLocked(Session session, IBinder client,
  2. boolean throwOnError) {
  3. WindowState win = mWindowMap.get(client);
  4. ......
  5. return win;
  6. }

后面会用WindowState的mWinAnimator对象的createSurfaceLocked函数来创建surfaceControl,最后再把这个copyFrom到outSurface,创给应用ViewRootImpl中的Surface。


  
  
  1. SurfaceControl surfaceControl = winAnimator.createSurfaceLocked();
  2. if (surfaceControl != null) {
  3. outSurface.copyFrom(surfaceControl);
  4. if (SHOW_TRANSACTIONS) Slog.i(TAG,
  5. " OUT SURFACE " + outSurface + ": copied");
  6. }

createSurfaceLocked会新建一个SurfaceControl对象


  
  
  1. mSurfaceControl = new SurfaceControl(
  2. mSession.mSurfaceSession,
  3. attrs.getTitle().toString(),
  4. width, height, format, flags);

在SurfaceControl对象的构造函数中调用nativeCreate JNI函数,利用传进来的mSession的mSurfaceSession,就是之前WindowState的attach函数中创建的。利用它来和SurfaceFlinger通信创建Surface。具体可以看http://blog.csdn.net/kc58236582/article/details/52421683博客

        mNativeObject = nativeCreate(session, name, w, h, format, flags);
  
  




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值