Android6.0 WMS(二) WMS创建窗口与创建Surface的关系
来源:互联网 发布:php 36进制 编辑:程序博客网 时间:2024/05/01 11:42
在上篇博客我们知道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函数
void attach() { if (WindowManagerService.localLOGV) Slog.v( TAG, "Attaching " + this + " token=" + mToken + ", list=" + mToken.windows); mSession.windowAddedLocked(); }
Session的windowAddedLocked函数会创建SurfaceSession对象
void windowAddedLocked() { if (mSurfaceSession == null) { if (WindowManagerService.localLOGV) Slog.v( WindowManagerService.TAG, "First window added to " + this + ", creating SurfaceSession"); mSurfaceSession = new SurfaceSession(); if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( WindowManagerService.TAG, " NEW SURFACE SESSION " + mSurfaceSession); mService.mSessions.add(this); if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) { mService.dispatchNewAnimatorScaleLocked(this); } } mNumWindow++; }而这个SurfaceSession的构造函数调用会调用nativeCreate JNI函数,这个函数我们不看了会创建一个和SurfaceFlinger连接的对象。这个我们在博客http://blog.csdn.net/kc58236582/article/details/52413871也分析过了。
public SurfaceSession() { mNativeClient = nativeCreate(); }
最后我们会把这个WindowState放在mWindowMap这个map中。
mWindowMap.put(client.asBinder(), win);
二、relayoutWindow函数
relayoutWindow函数上来,直接调用windowForClientLocked函数查找WindowState对象
WindowState win = windowForClientLocked(session, client, false);
这个函数就是从mWindowMap来查找WindowState对象,是根据应用共的IBinder对象来查询的。
final WindowState windowForClientLocked(Session session, IBinder client, boolean throwOnError) { WindowState win = mWindowMap.get(client); ...... return win; }
后面会用WindowState的mWinAnimator对象的createSurfaceLocked函数来创建surfaceControl,最后再把这个copyFrom到outSurface,创给应用ViewRootImpl中的Surface。
SurfaceControl surfaceControl = winAnimator.createSurfaceLocked(); if (surfaceControl != null) { outSurface.copyFrom(surfaceControl); if (SHOW_TRANSACTIONS) Slog.i(TAG, " OUT SURFACE " + outSurface + ": copied"); }
createSurfaceLocked会新建一个SurfaceControl对象
mSurfaceControl = new SurfaceControl( mSession.mSurfaceSession, attrs.getTitle().toString(), 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);
- Android6.0 WMS(二) WMS创建窗口与创建Surface的关系
- Android6.0 WMS(五) WMS计算Activity窗口大小的过程分析(二)WMS的relayoutWindow
- Android6.0 WMS(三) WMS窗口次序
- Android6.0 WMS(九) WMS切换Activity窗口(App Transition)的过程分析
- Android6.0 WMS(一) WMS和应用进程的关系
- Android6.0 WMS(八) 显示Activity的启动窗口
- WMS--窗口创建流程整理
- Android6.0 WMS(五) WMS计算Activity窗口大小的过程分析(一)应用进程
- Android6.0 WMS(十) WMS窗口动画从设置到显示框架
- Android6.0 WMS(十一) WMS窗口动画生成及播放
- Android6.0 WMS(七) 窗口Z轴位置
- Activity WMS ViewRootImpl三者关系(Activity创建窗口 按键分发等)
- Android6.0 WMS(四) WMS中常用变量分析
- Android6.0 WMS(六) WMS动画管理
- android6.0 Activity(三) Activity与WMS通信过程
- Android6.0 显示系统(二) SurfaceFlinger创建Surface
- Android6.0 显示系统(二) SurfaceFlinger创建Surface
- android6.0 Activity(四) Surface创建
- 无权图的单源最短路问题
- C#课堂笔记之VS注释快捷键
- 第十五周 用哈希表组织关键字
- 第十五周项目1—哈希表及其运算实现
- UVa 10881 Piotr's Ants (排序)
- Android6.0 WMS(二) WMS创建窗口与创建Surface的关系
- EDIUS实现跟踪马赛克效果的教程
- 第十四周--查找(一)--项目一
- 【第十四周 项目1(3)—验证二叉排序树相关算法】
- 利用Windows自带的功能当程序崩溃时产生崩溃转储文件(dmp)
- css3中transition属性
- 344. Reverse String
- QString基础知识
- 深度学习视觉领域常用数据集汇总