在上篇博客我們知道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);