当前位置:首页 > Windows程序 > 正文

WindowState注意事项

2021-03-24 Windows程序

Window #3 Window{20dd178e u0 com.android.mms/com.android.mms.ui.ConversationList}: mDisplayId=0 mSession=Session{cb5d53 25296:u0a10013} mClient=android.os.BinderProxy@31ef4b89 mOwnerUid=10013 mShowToOwnerOnly=true package=com.android.mms appop=NONE mAttrs=WM.LayoutParams{(0,0)(fillxfill) sim=#132 ty=1 fl=#5810100 pfl=0x8 wanim=0xa100000 vsysui=0x500 surfaceInsets=Rect(0, 0 - 0, 0) meizuFlags=0xca06 imeOffset=-1 splitActionBarHeight=144Meizu WM.LayoutParams [ flags=0x0] } Requested w=1080 h=1920 mLayoutSeq=517 mBaseLayer=21000 mSubLayer=0 mAnimLayer=21015+0=21015 mLastLayer=21015 mToken=AppWindowToken{25ebcb64 token=Token{2ca234f6 ActivityRecord{a4babb8 u0 com.android.mms/.ui.ConversationList t61}}} mRootToken=AppWindowToken{25ebcb64 token=Token{2ca234f6 ActivityRecord{a4babb8 u0 com.android.mms/.ui.ConversationList t61}}} mAppToken=AppWindowToken{25ebcb64 token=Token{2ca234f6 ActivityRecord{a4babb8 u0 com.android.mms/.ui.ConversationList t61}}} mViewVisibility=0x0 mHaveFrame=true mObscured=false mSeq=0 mSystemUiVisibility=0x500 mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0] mConfiguration={1.0 ?mcc?mnc zh_CN ldltr sw360dp w360dp h615dp 480dpi nrml long port finger -keyb/v/h -nav/h themeChanged.0 s.9} mHasSurface=true mShownFrame=[0.0,0.0][1080.0,1920.0] isReadyForDisplay()=true mFrame=[0,0][1080,1920] last=[0,0][1080,1920] mSystemDecorRect=[0,0][1080,1920] last=[0,0][0,0] Frames: containing=[0,0][1080,1920] parent=[0,0][1080,1920] display=[0,0][1080,1920] overscan=[0,0][1080,1920] content=[0,75][1080,1920] visible=[0,75][1080,1920] decor=[0,0][1080,1920] Cur insets: overscan=[0,0][0,0] content=[0,75][0,0] visible=[0,75][0,0] stable=[0,75][0,144] Lst insets: overscan=[0,0][0,0] content=[0,75][0,0] visible=[0,75][0,0] stable=[0,75][0,144] WindowStateAnimator{2aeee9fd com.android.mms/com.android.mms.ui.ConversationList}: mSurface=Surface(name=com.android.mms/com.android.mms.ui.ConversationList) mDrawState=HAS_DRAWN mLastHidden=false Surface: shown=true layer=21015 alpha=1.0 rect=(0.0,0.0) 1080.0 x 1920.0
1、Session类对象mSession

每个WindowState都有一个Session类成员变量,那么每个窗体保存的都是同一个mSession吗?还是每个窗体的mSession都不同呢?dump一下便知道了。dump日志告诉我上述两种情况都不是,其实是每个UI进程的全部窗体保存的是同一个Session。而每个UI进程之间的Session又是不同的。

Session顾名思义就是会话的意思,是ViewRootImpl用来调用WMS服务功能的东东,这个能够从Session类中的函数能够看出来。每个UI进程在何时创建一个Session的呢?是在add第一个View时创建的,这点大家能够去研究下源代码。Session类继承IWindowSession.Stub。能够知道WindowState中保存的是本地对象,而ViewRootImpl中 mWindowSession保存的是代理对象。

2、IWindow类对象mClient

mClient是一个代理对象,本地对象保存在ViewRootImpl中的mWindow中。

WMS利用mClient来通知ViewRootImpl一些状态的改变等。mClient代表的是UI进程側的一个窗体。

3、mOwnerUid

该变量保存的是UID。UID在Linux中是为多用户设计的,而在Android中赋予了新的使命--数据共享,android为每一个应用差点儿都分配了不同的UID,假设要实现两个程序的互訪,能够定义同样的android:sharedUserId,而且签名同样便可互訪。

4、mShowToOwnerOnly

这个变量是为多用户准备的,详细作用是标示一个窗体是否只在当前UID下才干显示。能够查看DisplayContent.switchUserStacks()关于多用户转换逻辑。

boolean isHiddenFromUserLocked() { return win.mShowToOwnerOnly && UserHandle.getUserId(win.mOwnerUid) != mService.mCurrentUserId; } 5、mAppOp

该变量保存着该窗体特有的一些权限,比方假设该窗体是一个SYSTEM_ALERT_WINDOW窗体,那么mAppOp中会保存这个特殊权限。在非常多地方权限管理AppOpsManager会检查这个窗体能否申请到相应的资源。

6、mAttrs

这个变量中保存了差点儿全部的关于该窗体的属性信息。比方窗体类型、flags、高度、宽度等等。

computeFrameLw()中就是依据mAttrs来确定窗体Frame的。

7、mRequestedWidth、mRequestedHeight

* The window size that was requested by the application.  These are in the application‘s coordinate space*,保存着应用要求的窗体高和宽,能够查看WMS.relayoutWindow()函数。

8、mLayoutSeq

WMS.performLayoutLockedInner被调用一次。WMS.mLayoutSeq就加1,在一次Layout过程中,假设对某一个窗体调用了mPolicy.layoutWindowLw()函数进行布局,win.mLayoutSeq 就更新为WMS.mLayoutSeq值。

所以通过查看WindowState.mLayoutSeq值就能够知道该窗体是在哪一次又一次布局过的。

9、mAttachedWindow

假设该变量不为null,表示当前窗体须要附加在mAttachedWindow之上。当前窗体是mAttachedWindow的子窗体。mAttachedWindow的赋值流程例如以下:当UI进程须要加入一个Window时。终于会调用WMS.addWindow()。addWindow()函数中有这段代码:

if (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW) { attachedWindow = windowForClientLocked(null, attrs.token, false); if (attachedWindow == null) { Slog.w(TAG, "Attempted to add window with token that is not a window: " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN; } if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) { Slog.w(TAG, "Attempted to add window with token that is a sub-window: " + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN; } } 假设加入的Window是一个子窗体,即(type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW),那么会依据attrs.token调用windowForClientLocked()找到父窗体,能够推測并得出父窗体跟子窗体的attrs中保存的是同一个W对象的结论,结论是否正确待验证。windowForClientLocked()找到的父窗体WindowState会保存在mAttachedWindow中。

10、mLayoutAttached

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66837.html