WindowState注意事项
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