Android 12 S WindowManager解读之从dumpsys window windows看window,Android 12 S WindowManager深度解析,从dumpsys窗口看window功能解读

马肤

温馨提示:这篇文章已超过419天没有更新,请注意相关的内容是否还可用!

摘要:本文解读了Android 12系统中的WindowManager组件,通过深入研究dumpsys命令下的window和windows模块,详细分析了window的管理机制。文章揭示了Android系统中窗口系统的核心功能和工作原理,包括窗口的创建、管理和交互等。对于理解和优化Android系统性能,提升应用程序开发效率具有重要意义。

/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java

Android 12 S WindowManager解读之从dumpsys window windows看window,Android WindowManager深度解析,从dumpsys窗口看window功能解读 第1张
(图片来源网络,侵删)
    /**
     * Adds the status bar view to the window manager.
     */
    public void attach() {
        // Now that the status bar window encompasses the sliding panel and its
        // translucent backdrop, the entire thing is made TRANSLUCENT and is
        // hardware-accelerated.
        mLp = new WindowManager.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                mBarHeight,
                WindowManager.LayoutParams.TYPE_STATUS_BAR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                PixelFormat.TRANSLUCENT);
        mLp.privateFlags |= PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
        mLp.token = new Binder();
        mLp.gravity = Gravity.TOP;
        mLp.setFitInsetsTypes(0 /* types */);
        mLp.setTitle("StatusBar");
        mLp.packageName = mContext.getPackageName();
        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mWindowManager.addView(mStatusBarView, mLp);
        mLpChanged.copyFrom(mLp);
        mContentInsetsProvider.addCallback(this::calculateStatusBarLocationsForAllRotations);
        calculateStatusBarLocationsForAllRotations();
    }

执行adb shell dumpsys window windows 如下:

  Window #3 Window{d2b0acf u0 StatusBar}://window名

Android 12 S WindowManager解读之从dumpsys window windows看window,Android WindowManager深度解析,从dumpsys窗口看window功能解读 第2张
(图片来源网络,侵删)

    mDisplayId=0(display id,单屏一般都是0,多屏会有其他的比如1) rootTaskId=1(根Taskid) mSession=Session{e98843e 2512:u0a10120} mClient=android.os.BinderProxy@64c3da9

    mOwnerUid=10120 showForAllUsers=true package=com.android.systemui(package包名) appop=NONE

    mAttrs={(0,0)(fillx96) gr=TOP CENTER_VERTICAL(在顶端且居中)sim={adjust=pan}(view布局适配键盘)

//标志0 layoutInDisplayCutoutMode=always//标志1 ty=STATUS_BAR fmt=TRANSLUCENT

      //标志2 fl=NOT_FOCUSABLE SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS

      //标志3 pfl=COLOR_SPACE_AGNOSTIC USE_BLAST FIT_INSETS_CONTROLLED

      //标志4 bhv=DEFAULT

      paramsForRotation={(0,0)(fillx96) gr=TOP CENTER_VERTICAL layoutInDisplayCutoutMode=always ty=STATUS_BAR fmt=TRANSLUCENT}}

    Requested w=7104 h=96 mLayoutSeq=2553

    //标志5 mBaseLayer=171000 mSubLayer=0    mToken=WindowToken{2f5ef2e android.os.BinderProxy@2471d30}

     //标志6 mViewVisibility=0x0 mHaveFrame=true mObscured=false

    mGivenContentInsets=[0,0][0,0] mGivenVisibleInsets=[0,0][0,0]

    //当前config mFullConfiguration={1.0 ?mcc?mnc [en_US] ldltr sw960dp w1776dp h876dp 640dpi xlrg long land vrheadset -touch -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 7104, 3840) mAppBounds=Rect(0, 0 - 7104, 3600) mMaxBounds=Rect(0, 0 - 7104, 3840) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.33 fontWeightAdjustment=0}

    //上一次的config mLastReportedConfiguration={1.0 ?mcc?mnc [en_US] ldltr sw960dp w1776dp h876dp 640dpi xlrg long land vrheadset -touch -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 7104, 3840) mAppBounds=Rect(0, 0 - 7104, 3600) mMaxBounds=Rect(0, 0 - 7104, 3840) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.33 fontWeightAdjustment=0}

    mHasSurface=true(是否已创建Surface) isReadyForDisplay()=true(是否准备好要显示到屏幕上) mWindowRemovalAllowed=false

    //标志7 Frames: containing=[0,0][7104,3840] parent=[0,0][7104,3840] display=[0,0][7104,3840]

    mFrame=[0,0][7104,96] last=[0,0][7104,96]

     surface=[0,0][0,0]

    ContainerAnimator:

      mLeash=Surface(name=Surface(name=d2b0acf StatusBar)/@0x7ec48b - animation-leash of insets_animation)/@0x239f0e5 mAnimationType=insets_animation

      Animation: com.android.server.wm.InsetsSourceProvider$ControlAdapter@eab4059

        ControlAdapter mCapturedLeash=Surface(name=Surface(name=d2b0acf StatusBar)/@0x7ec48b - animation-leash of insets_animation)/@0x239f0e5

    WindowStateAnimator{1f471bd StatusBar}:

       mAnimationIsEntrance=true      mSurface=Surface(name=StatusBar)/@0x4ea33b2(Surface的名字)

      Surface: shown=true(surface是否已显示) layer=0 alpha=1.0 rect=(0.0,0.0)  transform=(1.0, 0.0, 0.0, 1.0)

      //标志8 mDrawState=HAS_DRAWN       mLastHidden=false

      mEnterAnimationPending=false      mSystemDecorRect=[0,0][0,0]

    mLastFreezeDuration=+268ms

    mForceSeamlesslyRotate=false seamlesslyRotate: pending=null finishedFrameNumber=0

    isOnScreen=true(是否在屏幕上)

    isVisible=true(是否可见)

适配刘海屏

标志0代表当前是怎么适配刘海屏的,Android 是允许您控制是否在刘海区域内显示内容的,有如下几种适配方式,您可以将 layoutInDisplayCutoutMode 设为以下某个值

layoutInDisplayCutoutMode的默认值是LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT。

layoutInDisplayCutoutMode
Value含义
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT0这是默认行为,在竖屏模式下,内容会呈现到刘海区域中;但在横屏模式下,内容会显示黑边。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES1在竖屏模式和横屏模式下,内容都会呈现到刘海区域中
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER2内容从不呈现到刘海区域中
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS3窗口总是可以扩展到刘海区域中

窗口类型

标志1代表当前的窗口类型,窗口总共三大类型,分别是Application类型, 子窗口类型,以及系统窗口类型:

窗口类型Vlaue含义
以下窗口类型为普通APPLICAT窗口类型,范围1-99
FIRST_APPLICATION_WINDOW 1App的初始值
TYPE_BASE_APPLICATION1所有App的基础值
TYPE_APPLICATION2普通应用程序窗口
TYPE_APPLICATION_STARTING3starting窗口
TYPE_DRAWN_APPLICATION4等待绘制完成的窗口
LAST_APPLICATION_WINDOW 99App的最大值
以下窗口类型为子窗口类型,范围1000-1999
FIRST_SUB_WINDOW 1000子窗口的初始值
TYPE_APPLICATION_PANELFIRST_SUB_WINDOW 应用程序窗口顶部的面板。这些窗口出现在它们的附属窗口的顶部。
TYPE_APPLICATION_MEDIAFIRST_SUB_WINDOW +1media子窗口
TYPE_APPLICATION_SUB_PANELFIRST_SUB_WINDOW +2子窗口之上的子窗口

TYPE_APPLICATION_ATTACHED

_DIALOG

FIRST_SUB_WINDOW +3Dialog子窗口

TYPE_APPLICATION_MEDIA

_OVERLAY

FIRST_SUB_WINDOW +4media子窗口之上的子窗口

TYPE_APPLICATION_ABOVE_

SUB_PANEL

FIRST_SUB_WINDOW +5在SUB_PANEL之上的子窗口
LAST_SUB_WINDOW 1999子窗口的最大值
以下为系统窗口类型,范围2000-2999
FIRST_SYSTEM_WINDOW2000系统窗口的初始值
TYPE_STATUS_BARFIRST_SYSTEM_WINDOW系统状态栏窗口
TYPE_SEARCH_BARFIRST_SYSTEM_WINDOW+1搜索条窗口
TYPE_PHONEFIRST_SYSTEM_WINDOW+2通话窗口,位于状态栏之上
TYPE_SYSTEM_ALERTFIRST_SYSTEM_WINDOW+3Alert窗口,如电量不足提示,显示在APP之上窗口
TYPE_KEYGUARDFIRST_SYSTEM_WINDOW+4锁屏窗口
TYPE_TOASTFIRST_SYSTEM_WINDOW+5短暂的提示框窗口
TYPE_SYSTEM_OVERLAYFIRST_SYSTEM_WINDOW+6系统覆盖窗口,不能接受input焦点,否则会与屏保发生冲突
TYPE_PRIORITY_PHONEFIRST_SYSTEM_WINDOW+7电话优先窗口,如屏保状态下显示来电窗口
TYPE_SYSTEM_DIALOGFIRST_SYSTEM_WINDOW+8系统Dialog窗口
TYPE_KEYGUARD_DIALOGFIRST_SYSTEM_WINDOW+9keyguard Dialog窗口
TYPE_SYSTEM_ERRORFIRST_SYSTEM_WINDOW+10系统报错窗口
TYPE_INPUT_METHODFIRST_SYSTEM_WINDOW+11输入法窗口
TYPE_INPUT_METHOD_DIALOGFIRST_SYSTEM_WINDOW+12输入法Dialog窗口
TYPE_WALLPAPERFIRST_SYSTEM_WINDOW+13壁纸窗口
TYPE_STATUS_BAR_PANELFIRST_SYSTEM_WINDOW+14从状态栏滑出的面板在多用户系统中显示在所有用户的窗口上。

TYPE_SECURE_SYSTEM_OVERLAY

FIRST_SYSTEM_WINDOW+15@hide
TYPE_DRAGFIRST_SYSTEM_WINDOW+16@hide拖拽窗口

TYPE_STATUS_BAR_SUB_PANEL

FIRST_SYSTEM_WINDOW+17@hide,status bar之上的子窗口
TYPE_POINTERFIRST_SYSTEM_WINDOW+18@hide
TYPE_NAVIGATION_BARFIRST_SYSTEM_WINDOW+19@hide导航栏窗口
TYPE_VOLUME_OVERLAYFIRST_SYSTEM_WINDOW+20@hide系统音量条
TYPE_BOOT_PROGRESSFIRST_SYSTEM_WINDOW+21@hide启动时的进度条窗口
TYPE_INPUT_CONSUMERFIRST_SYSTEM_WINDOW+22@hide消耗input事件的窗口
TYPE_NAVIGATION_BAR_PANELFIRST_SYSTEM_WINDOW+24@hide
TYPE_DISPLAY_OVERLAYFIRST_SYSTEM_WINDOW+26@hide用于模拟第二个Display显示屏
TYPE_MAGNIFICATION_OVERLAYFIRST_SYSTEM_WINDOW+27@hide
TYPE_PRIVATE_PRESENTATIONFIRST_SYSTEM_WINDOW+30
TYPE_VOICE_INTERACTIONFIRST_SYSTEM_WINDOW+31@hide
TYPE_ACCESSIBILITY_OVERLAYFIRST_SYSTEM_WINDOW+32

TYPE_VOICE_INTERACTION_STARTING

FIRST_SYSTEM_WINDOW+33@hide
TYPE_DOCK_DIVIDERFIRST_SYSTEM_WINDOW+34@hide
TYPE_QS_DIALOGFIRST_SYSTEM_WINDOW+35@hide
TYPE_SCREENSHOTFIRST_SYSTEM_WINDOW+36@hide在锁屏之上,该层保留截图动画,区域选择和UI。
TYPE_PRESENTATIONFIRST_SYSTEM_WINDOW+37@hide用于在外部显示器上显示的窗口(多个屏幕情况下)
TYPE_APPLICATION_OVERLAYFIRST_SYSTEM_WINDOW+38

TYPE_ACCESSIBILITY_MAGNIFICATION

_OVERLAY

FIRST_SYSTEM_WINDOW+39@hide
TYPE_NOTIFICATION_SHADEFIRST_SYSTEM_WINDOW+40@hide
TYPE_STATUS_BAR_ADDITIONALFIRST_SYSTEM_WINDOW+41@hide
LAST_SYSTEM_WINDOW2999系统窗口的最大值

窗口Flag

标志2地方的意思是窗口所携带的 flag,这个指的这个这个window 所携带的flag, 窗口的flag如下

序号FLAG作用
1FLAG_ALLOW_LOCK_WHILE_SCREEN_ON0x00000001只要该window可见,允许屏幕开启的时候锁屏
2FLAG_DIM_BEHIND0x00000002所有在携带这个flag的window后面的窗口都会变暗
3FLAG_BLUR_BEHIND0x00000004为这个窗口启用后面模糊。
4FLAG_NOT_FOCUSABLE0x00000008该window不能获取焦点
5FLAG_NOT_TOUCHABLE0x00000010该window不能触摸
6FLAG_NOT_TOUCH_MODAL0x00000020无模式窗口,在该窗口区域外的pointer时间将传给它后面的其他窗口,而不是由它自己处理
7FLAG_TOUCHABLE_WHEN_WAKING0x00000040当设备进入睡眠状态时,设置此标志可以使你获取第一次触摸事件(因为这时候用户不并不知道他们点击的是屏幕上的哪个位置,所以通畅这一世间是由系统自动处理的)
8FLAG_KEEP_SCREEN_ON0x00000080只要这个窗口可见,屏幕将保持常亮
9FLAG_LAYOUT_IN_SCREEN0x00000100窗口显示时不考虑系统装饰窗eg, statusbar
10FLAG_LAYOUT_NO_LIMITS0x00000200允许窗口超出屏幕区域
11FLAG_FULLSCREEN0x00000400隐藏所有的装饰窗口窗口,如statusbar
12FLAG_FORCE_NOT_FULLSCREEN0x00000800和上面的标志相反
13FLAG_DITHER0x00001000将此窗口合成到屏幕时,打开抖动。丢弃
14FLAG_SECURE0x00002000窗口内容被认为是保密的,所以它无法出现在截屏中,不安全的屏幕上也无法显示
15FLAG_SCALED0x00004000按照用户提供的参数做伸缩调整
16FLAG_IGNORE_CHEEK_PRESSES0x00008000有的时候用户会和屏幕贴的很近,如打电话,这种情况下出现的某些事件可能是无意的,不应该相应
17FLAG_LAYOUT_INSET_DECOR0x00010000只能和FLAG_LAYOUT_IN_SCREEN一起使用,当设置了全屏显示布局时,应用窗口部分内容仍然可能被系统装饰窗口覆盖,如果同时设置了这一标志时,系统将充分考虑系统窗口所占的区域,以防出现上述情况。
18FLAG_ALT_FOCUSABLE_IM0x00020000设置后,反转窗口的输入法聚焦性。设置此标志的效果取决于是否设置了#FLAG_NOT_FOCUSABLE
19FLAG_WATCH_OUTSIDE_TOUCH0x00040000该值配合FLAG_NOT_TOUCH_MODAL才会生效,代表该window以外的区域也是可以接收key的
20FLAG_SHOW_WHEN_LOCKED0x00080000使窗口可以显示在锁屏之上
21FLAG_SHOW_WALLPAPER0x00100000让壁纸在这个窗口之后显示,当窗口是透明后或者半透明的时候,可以看到后面的壁纸
22FLAG_TURN_SCREEN_ON0x00200000窗口显示时将屏幕点亮,如来电界面
23FLAG_DISMISS_KEYGUARD0x00400000窗口显示时,将解锁屏幕锁,只是它不是一个secure lock
24FLAG_SPLIT_TOUCH0x00800000当设置时,窗口将接受超出其边界的触摸事件发送到其他支持拆分触摸的窗口。当这个标志没有设置时,第一个向下的指针决定了所有后续触摸的窗口,直到所有指针向上。当设置这个标志时,每个指针(不一定是第一个)向下的指针决定了该指针的所有后续触摸将进入的窗口,直到该指针向上为止,从而使具有多个指针的触摸可以在多个窗口中分割。
25FLAG_HARDWARE_ACCELERATED0x01000000启动硬件加速,但加了该flag并不一定保证窗口一定能得到硬件加速
26FLAG_LAYOUT_IN_OVERSCAN0x02000000允许窗口内容扩展到屏幕的扫描区域(如果有的话)。窗口仍然应该正确定位其内容,以考虑过扫描区域。这个标志可以在你的主题中通过android.R.attr #windowOverscan属性来控制;该属性是在标准监视主题中自动为您设置的
27FLAG_TRANSLUCENT_STATUS0x04000000请求一个半透明的状态栏与最小的系统提供的背景保护。这个标志可以在你的主题中通过android.R.attr #windowTranslucentStatus属性来控制;这个属性是在标准半透明装饰主题中自动设置的
28FLAG_TRANSLUCENT_NAVIGATION0x08000000请求一个半透明的导航栏与最小的系统提供的背景保护。这个标志可以在你的主题中通过android.R.attr #windowTranslucentNavigation属性来控制;这个属性是在标准半透明装饰主题中自动设置的
29FLAG_LOCAL_FOCUS_MODE0x10000000本地焦点模式下窗口的标志。本地焦点模式下的窗口可以使用window# setLocalFocus (boolean, boolean)}独立于窗口管理器控制焦点。
30FLAG_SLIPPERY0x20000000允许触摸在手势的中间从窗口滑到相邻的窗口,而不是在手势的持续时间内被捕获。这个标志只改变了这个窗口的触摸焦点行为。触摸可以滑出窗口,但不一定滑回来(除非另一个有触摸焦点的窗口允许)。
31FLAG_LAYOUT_ATTACHED_IN_DECOR0x40000000当请求带有附属窗口的布局时,附属窗口可能与父窗口的屏幕装饰重叠,例如导航栏。通过包含此标志,窗口管理器将在父窗口的装饰框架内布局附加的窗口,这样它就不会与屏幕装饰重叠。
32FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS0x80000000表明该窗口负责绘制系统栏的背景。如果设置了,系统栏将使用透明背景绘制,并且该窗口中的相应区域将使用window # getStatusBarColor()}和window #getNavigationBarColor()}中指定的颜色填充。

窗口Private Flag

标志3处也是窗口的一些Flag特征,只不过这些Flag都添加有@hide的,所以是不对外暴露的,所以应用是无法添加这些flag的。

PRIVATE_FLAG含义
PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED0x00000002在系统进程中,我们全局不使用硬件加速,因为有很多线程在那里做UI,它们会发生冲突。如果UI的某些部分确实想要使用硬件加速,则可以设置此标志来强制使用。这基本上是用于锁屏的。如果有人用它,你可能错了
PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS0x00000004默认情况下,壁纸滚动时壁纸会发送新的偏移,壁纸可以通过调用方法来选择跳过这些通知
PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY0x00000008
SYSTEM_FLAG_SHOW_FOR_ALL_USERS0x00000010在多用户系统中,如果设置了这个标志,并且所有者是一个系统进程,那么这个窗口将出现在所有用户屏幕上。这将覆盖通常只出现在拥有用户屏幕上的窗口类型的默认行为。请参考每个窗口类型以确定其默认行为。
PRIVATE_FLAG_NO_MOVE_ANIMATION0x00000040永远不要让窗口的位置变化产生动画效果。
PRIVATE_FLAG_COMPATIBLE_WINDOW0x00000080限制窗口大小为原始大小的特殊标志([320x480] x密度)。用于为在兼容模式下运行的应用程序创建窗口
PRIVATE_FLAG_SYSTEM_ERROR0x00000100用于系统对话框的特殊选项。当设置此标志时,窗口将在创建时无条件地要求焦点。
PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS0x00000800防止当前窗口后面的墙纸接收触摸事件的标志。
PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR0x00001000强制状态栏窗口始终可见。如果设置此标志时该栏被隐藏,则会再次显示。它只在 LayoutParams # TYPE_STATUS_BAR设置时生效。
PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY0x00004000使窗口忽略应用可见性。而完全依赖于decor视图可见性来确定窗口可见性。这是recents在启动应用程序后用来继续绘图的。
PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH0x00008000指示该窗口不会在配置更改触发的活动重新启动时被替换。通常,WindowManager期望在重新启动后替换Windows,因此它将保留其surfaces,直到替换准备显示,以防止视觉故障。然而,一些窗口,如PopupWindows期望在配置更改时被清除,因此应该提示WindowManager它不应该等待替换。

PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN

_PARENT_FRAME

0x00010000表示无论当前的窗口模式配置如何,该子窗口应始终布局在父框架中
PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS0x00020000表示无论其他标志是什么,该窗口总是绘制状态栏背景。
PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE0x00040000如果设备支持,表示此窗口需要持续性能模式的标志。

SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY

_WINDOWS

0x00080000表示任何由应用程序进程添加的窗口类型为TYPE_TOAST或需要@link android.app。
PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY0x00100000此窗口是某些设备上存在的圆角覆盖,这意味着它将被排除在:屏幕截图,屏幕放大和镜像中。
PRIVATE_FLAG_NOT_MAGNIFIABLE0x00400000防止窗口被辅助功能放大器放大。
PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION0x00800000表示状态栏窗口处于强制显示导航栏的状态,除非导航栏窗口显式地设置为view# GONE,它只在 LayoutParams # TYPE_STATUS_BAR设置时生效。
PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC0x01000000表示该窗口与颜色空间无关,并且该颜色可以解释到任何颜色空间。
PRIVATE_FLAG_USE_BLAST0x02000000请求创建一个BLAST (Buffer as LayerState)层的标志。

如果没有指定,客户端将接收一个BufferQueue层。

PRIVATE_FLAG_APPEARANCE_CONTROLLED0x04000000表明窗口正在控制系统栏的外观。所以我们不需要通过读取它的系统UI标志来调整它的兼容性。
PRIVATE_FLAG_BEHAVIOR_CONTROLLED0x08000000表明窗口正在控制系统栏的行为。因此,我们不需要通过读取其窗口标志或系统UI标志来调整它的兼容性。
PRIVATE_FLAG_FIT_INSETS_CONTROLLED0x10000000指示窗口自己控制如何适应窗口插入。所以我们不需要调整它的属性来适应窗口的嵌套。
PRIVATE_FLAG_TRUSTED_OVERLAY0x20000000表明窗口是受信任的覆盖层
PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME0x40000000表示窗口的父框架应该由IME插入。

PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG

_AND_DROP

0x80000000

表示我们想要拦截和处理所有用户的全局拖放操作

此标志允许考虑窗口的拖动事件,即使不可见,并且将接收系统中所有活动用户的拖动。

附加数据提供给带有此标志的窗口,包括{@link ClipData},包括所有带有DragEvent # ACTION_DRAG_STARTED}事件的项目,以及带有DragEvent # ACTION_DROP}事件的实际拖拽面。如果窗口消耗了拖放,那么拖放表面的清理(作为DragEvent # ACTION_DROP的一部分提供)将被交给窗口。

System Bar Benhaviior

标志4用于描述System Bar的行为

System Bar BenhaviiorValue含义
BEHAVIOR_SHOW_BARS_BY_TOUCH0

可通过setSystemBarsBehavior进行设置。

如果导航栏被#hide(int)或setsetsandalpha (Insets, float, float)隐藏,系统栏将被强制显示在任何用户交互的相应显示器上。@deprecated在Android S和更高版本上不支持。

使用#BEHAVIOR_DEFAULT或# BEHAVIOR_SHOW_

TRANSIENT

_BARS_BY_SWIPE代替。

BEHAVIOR_DEFAULT1

可通过setSystemBarsBehavior进行设置。窗口希望通过调用#hide(int)或#setInsetsAndAlpha (Insets, float, float)}来隐藏导航条时保持交互。

当系统栏在此模式下隐藏时,可以通过系统手势显示它们,例如从隐藏栏的屏幕边缘滑动。

启用手势导航后,无论系统栏是否可见,都可以触发系统手势。

BEHAVIOR_SHOW_BARS_BY_SWIPE

BEHAVIOR

_DEFAULT

可通过setSystemBarsBehavior进行设置。窗口希望通过调用#hide(int)或#setInsetsAndAlpha (Insets, float, float)}隐藏导航栏时保持交互。

当系统栏在此模式下隐藏时,可以通过系统手势显示它们,例如从隐藏栏的屏幕边缘滑动。

使用#BEHAVIOR_DEFAULT代替。

BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE2

可通过setSystemBarsBehavior进行设置。窗口希望通过调用#hide(int)或#setInsetsAndAlpha (Insets, float, float)}隐藏导航栏时保持交互。

当系统栏在此模式下隐藏时,可以通过系统手势暂时显示它们,例如从隐藏栏的屏幕边缘滑动。这些短暂的系统条将覆盖应用程序的内容,可能有一定程度的透明度,并在短暂的超时后自动隐藏。

mBaseLayer 

  标志5 mBaseLayer,代表窗口的layer层级,根据窗口Type转化而来,代码如下:

    WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
            WindowState parentWindow, int appOp, WindowManager.LayoutParams a, int viewVisibility,
            int ownerId, int showUserId, boolean ownerCanAddInternalSystemWindow,
            PowerManagerWrapper powerManagerWrapper) {

                 ......

        if (mAttrs.type >= FIRST_SUB_WINDOW && mAttrs.type = FIRST_APPLICATION_WINDOW && type 

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码