唐山网站建设互众动力内蒙古两学一做网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 08:23
当前位置: 首页 > news >正文
唐山网站建设互众动力,内蒙古两学一做网站,ppt模板网站源码,app订制开发公司前言
Android的窗口Window分为三种类型#xff1a;
应用Window#xff0c;比如Activity、Dialog#xff1b;子Window#xff0c;比如PopupWindow#xff1b;系统Window#xff0c;比如Toast、系统状态栏、导航栏等等。
应用Window的Z-Ordered最低#xff0c;就是在系…前言
Android的窗口Window分为三种类型
应用Window比如Activity、Dialog子Window比如PopupWindow系统Window比如Toast、系统状态栏、导航栏等等。
应用Window的Z-Ordered最低就是在系统中的显示层级最低然后到子Window层级最高的是系统Window。层级高的Window会覆盖层级低的Window。 要让窗口覆盖显示只需要使它的层级比上个窗口高。
三种窗口对应不同的WindowToken每个应用组件应用组件可以是Activity、InputMethod、Wallpaper等每个组件对应一个WindowToken都需要通过WindowToken向WMS申请添加窗口WMSWindowManagerSerivce通过根据窗口的WindowToken进行分类组织相同WindowToken的窗口紧密联系。应用组件在新建窗口时必须提供WindowToken表面窗口身份类型。系统窗口会隐式申明WindowToken同时WMS会在addWindow()时进行鉴权。
应用窗口层级
Activity的显示
先从Activity的setContentView()的源码入手 在AppCompatDelegateImpl源码中
mSubDecor并非Window中的DecorView在创建DecorView之后创建的一个子DecorView包括是否是包含ActionBar、FloatingActionButton等相当于旧版本的DecorView中TitleBar。
getWindow()是返回返回Activity的mWindow变量指向一个Window的对象Window是一个抽象类这里返回的是PhoneWindow对象PhoneWindow是Window的子类PhoneWindow中有一个DecorView对象DecorView实际上就是个FrameLayoutsetContentView()的子布局最终会添加到DecorView中DecorView为当前窗口的根视图。
这个根视图是如何最终被绘制出来的
Window表示一个抽象窗口的概念是View的直接管理者对应一个ViewWindow和View之间由ViewRootImpl联系。
Activity的View层级就是如下:
应用窗口层级类型
WMS在进行应用窗口叠加时会动态改变应用窗口的层值但层值不会大于99。
public static final int FIRST_APPLICATION_WINDOW 1;
public static final int TYPE_BASE_APPLICATION 1;
public static final int TYPE_APPLICATION 2;
public static final int TYPE_APPLICATION_STARTING 3;
public static final int TYPE_DRAWN_APPLICATION 4;
public static final int LAST_APPLICATION_WINDOW 99;1.Activity的默认窗口层级为TYPE_BASE_APPLICATION。通过WindowManager.addView()将DecorView添加到窗口中。在ActivityThread中有这样一段代码 2.Dialog默认的层级为TYPE_APPLICATION Dialog的创建 1.创建Window方法同Activity创建 2.初始化DecorView并将Dialog的视图添加进DecorView 3.将DecorView添加到Window中显示。 同为TYPE_APPLICATION层级的也有ActionMode Windowmanager的LayoutParams构造方法如果不指定windowtype默认为TYPE_APPLICATION所以Dialog在Activity中创建时不指定窗口层级默认为TYPE_APPLICATION。 在Service中创建Dialog并弹出时跟Activity同样代码会报错。需要设置为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT的系统窗口层级以上才可以正常显示。
3.TYPE_APPLICATION_STARTING 启动窗口Z-Ordered应高于应用程序中的所有其他窗口。为Android12特有的启动画面StartingWindow 即包含SplashScreen。这里还涉及到SystemUI的WMShell组件其中SplitScreen分屏模式、OneHanded单手模式、Freeform自由窗口模式、Bubble气泡通知窗口Android Q、PIP画中画模式等等系统模式窗口为WMShell处理的一部分。
经常在应用中做一些Toast临时弹框但Toast为系统窗口而不是应用窗口层级为TYPE_TOAST不在应用窗口的范畴。在下面系统窗口介绍。
子窗口层级Sub Window) public static final int FIRST_SUB_WINDOW 1000;public static final int TYPE_APPLICATION_PANEL FIRST_SUB_WINDOW;public static final int TYPE_APPLICATION_MEDIA FIRST_SUB_WINDOW 1;public static final int TYPE_APPLICATION_SUB_PANEL FIRST_SUB_WINDOW 2;public static final int TYPE_APPLICATION_ATTACHED_DIALOG FIRST_SUB_WINDOW 3;public static final int TYPE_APPLICATION_MEDIA_OVERLAY FIRST_SUB_WINDOW 4;public static final int TYPE_APPLICATION_ABOVE_SUB_PANEL FIRST_SUB_WINDOW 5;public static final int LAST_SUB_WINDOW 1999;子窗口类型必须设置为应用窗口附加的窗口。 这些类型的窗口在 Z-Ordered中保持在它们附加的窗口旁边并且它们的坐标是相对于所附加的应用窗口。
1.TYPE_APPLICATION_PANEL为面板子窗口应用窗口顶部的面板例如PopupWindow PopupWindow源码中指定的窗口层级 private int mWindowLayoutType WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;2.TYPE_APPLICATION_MEDIA显示媒体如视频的窗口。为Android 7.1之前的SurfaceView源码中默认的层级在SurfaceView源码中的setZOrderOnTop()方法设置SurfaceView的显示顺序。 public void setZOrderOnTop(booleanonTop) {if (onTop) {mWindowType WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;// ensures the surface is placed below the IMEmLayout.flags | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;} else {mWindowType WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;mLayout.flags ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;}}3.TYPE_APPLICATION_MEDIA_OVERLAY为隐藏的类型应用程序无法直接调用。同样在Android 7.1之前的SurfaceView源码中涉及 public void setZOrderMediaOverlay(booleanisMediaOverlay) {mWindowType isMediaOverlay? WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY: WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;}4.TYPE_APPLICATION_SUB_PANEL应用窗口的子面板代表在TYPE_APPLICATION_PANEL的上层例如PopupWindow弹出列表或者弹出Editor等编辑框等等。
5.TYPE_APPLICATION_ATTACHED_DIALOG类似于TYPE_APPLICATION_PANEL但窗口的布局是作为顶级窗口的布局发生的而不是作为其容器的子窗口。例如CharacterPickerDialog。在PhoneWindow源码中的openPanel()方法使用的就是这个类型在Android7.1以上则不同两个值都小于0 代表在当前显示窗口的下层: 6.TYPE_APPLICATION_ABOVE_SUB_PANEL隐藏的类型为应用窗口之上的子面板及其子面板窗口。 这些窗口显示在其附加窗口和任何 TYPE_APPLICATION_SUB_PANEL 面板的顶部。
系统窗口层级
在开发过程中经常这样添加窗口
mWindowManager (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mLayoutParams new WindowManager.LayoutParams();
mLayoutParams.height WindowManager.LayoutParams.WRAP_CONTENT; mLayoutParams.width WindowManager.LayoutParams.WRAP_CONTENT;
mLayoutParams.format PixelFormat.RGBA_8888;
mLayoutParams.flags | WindowManager.LayoutParams.FLAG_FULLSCREEN; mLayoutParams.flags | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams.type WindowManager.LayoutParams. TYPE_APPLICATION_OVERLAY;
mWindowManager.addView(view, mLayoutParams);注TYPE_APPLICATION_OVERLAY为Android 8加入的类型
这样添加的窗口都为系统窗口同时也需要窗口权限。
uses-permission android:nameandroid.permission.SYSTEM_ALERT_WINDOW /下面为系统窗口层级类型
窗口类型描述FIRST_SYSTEM_WINDOW系统的窗口类型起始值2000TYPE_STATUS_BAR状态栏。只能有一个状态栏窗口在屏幕的顶部所有其他窗口都向下移动所以它们在屏幕的下面。可通过参数设置全屏。TYPE_SEARCH_BAR搜索栏。只能有一个搜索栏窗口在屏幕的顶部。在StatusBar上显示TYPE_PHONE电话窗口例如来电通话。在应用窗口之上但位于状态栏的后面。已过时用TYPE_APPLICATION_OVERLAY替代TYPE_SYSTEM_ALERT系统警告窗口如低电量警告弹框。已过时用TYPE_APPLICATION_OVERLAY替代。TYPE_KEYGUARD锁屏窗口。不生成引用的接口。TYPE_TOASTToast临时通知窗口。已过时用TYPE_APPLICATION_OVERLAY替代。TYPE_SYSTEM_OVERLAY系统覆盖窗口需要显示在其他所有窗口之上。这些窗口不能进行输入聚焦否则会干扰锁屏。已过时用TYPE_APPLICATION_OVERLAY替代。TYPE_PRIORITY_PHONE优先手机UI即使锁屏处于活动状态也需要显示。这些窗口不能进行输入聚焦否则会干扰锁屏。已过时用TYPE_APPLICATION_OVERLAY替代。TYPE_SYSTEM_DIALOG从状态栏滑出的面板。TYPE_KEYGUARD_DIALOG锁屏时显示的对话框。TYPE_SYSTEM_ERROR系统错误窗口。已过时用TYPE_APPLICATION_OVERLAY替代。TYPE_INPUT_METHOD输入法窗口显示在正常UI上方。可以调整应用程序窗口的大小或平移以在显示该窗口时保持输入焦点可见。TYPE_INPUT_METHOD_DIALOG输入法对话框窗口显示在当前输入法窗口上方。TYPE_WALLPAPER壁纸窗口。放在任何想在壁纸上的窗口后面显示的层级上。系统有壁纸服务跟过壁纸对应的TOKEN对窗口进行特殊调节TYPE_STATUS_BAR_PANEL从状态栏上滑出的面板例如SystemUIDialogSystemUI的HeadsUpView。不生成的APP使用的类型TYPE_SECURE_SYSTEM_OVERLAY安全系统覆盖窗口需要显示在其他所有窗口之上。这些窗口不能进行输入聚焦否则会干扰锁屏。这与TYPE_SYSTEM_OVERLAY完全相同只是只允许系统本身创建这些覆盖。应用程序无法获得创建安全系统覆盖的权限。隐藏的类型TYPE_DRAG拖放伪窗口。最多只有一个拖动层并且它被放置在所有其他窗口的顶部。隐藏的类型TYPE_STATUS_BAR_SUB_PANEL从状态栏上滑出的面板显示在所有用户的窗口上。这些窗口显示在状态栏和任何TYPE_STATUS_BAR_PANEL窗口的顶部。例如SystemUIDialog通过setWindowOnTop()方法切换TYPE_STATUS_BAR_PANEL的TYPE_STATUS_BAR_SUB_PANEL显示层级。隐藏的类型TYPE_POINTER鼠标指针。隐藏的类型TYPE_NAVIGATION_BAR导航栏。隐藏的类型TYPE_VOLUME_OVERLAY用户更改系统音量时显示的音量级别对话框。隐藏的类型TYPE_BOOT_PROGRESS启动进度对话框位于所有内容的顶部。隐藏的类型TYPE_INPUT_CONSUMER当系统UI栏被隐藏时使用输入事件的窗口类型。隐藏的类型TYPE_NAVIGATION_BAR_PANEL导航栏面板当导航栏不同于状态栏时。隐藏的类型TYPE_DISPLAY_OVERLAY显示覆盖窗口。用于模拟辅助显示设备。隐藏的类型TYPE_MAGNIFICATION_OVERLAY放大叠加窗口。当启用可访问性放大时用于突出显示显示器的放大部分。隐藏的类型TYPE_PRIVATE_PRESENTATION私有顶部的演示Presentation窗口。Presentation会根据对应的Display的参数FLAG_PRIVATE来配置。TYPE_VOICE_INTERACTION语音交互窗口。隐藏的类型TYPE_ACCESSIBILITY_OVERLAY由连接的AccessibilityService覆盖的窗口用于拦截用户交互而无需更改可访问性服务可以内省的窗口。特别是可访问性服务只能内省有视力的用户可以与之交互的窗口即他们可以触摸这些窗口或在这些窗口中键入内容。例如如果有一个可触摸的全屏辅助功能覆盖则辅助功能服务将对其下方的窗口进行内省即使它们被可触摸窗口覆盖。TYPE_VOICE_INTERACTION_STARTING语音交互层的启动窗口。TYPE_DOCK_DIVIDER用于显示用于调整堆栈大小的句柄的窗口。此窗口由系统进程所有。隐藏的类型TYPE_QS_DIALOG类似于 TYPE_APPLICATION_ATTACHED_DIALOG但由快速设置平铺使用。隐藏的类型TYPE_SCREENSHOT屏幕截图。截取之下的窗口层级。如果采用android远程的层级截图无法截取倒车相关的UI视图。隐藏接口。TYPE_PRESENTATION外部显示器上的演示窗口。隐藏的类型TYPE_APPLICATION_OVERLAY用程序覆盖窗口显示在所有活动窗口上方类型介于 FIRST_APPLICATION_WINDOW和 LAST_APPLICATION_WINDOW之间但显示在状态栏或IME等关键系统窗口下方。系统可以随时改变这些窗口的位置、大小或可见性以减少用户的视觉混乱并管理资源要android.Manifest.permissionSYSTEM_ALERT_WINDOW权限。系统将调整具有此窗口类型的进程的重要性以减少低内存杀手杀死它们的机会TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY用于在其他窗口之上添加辅助功能窗口放大倍数的窗口。这将把窗口放置在覆盖窗口中。隐藏的类型TYPE_NOTIFICATION_SHADE锁屏时通知效果。只能有一个状态栏窗口它被放置在屏幕的顶部所有其他窗口都向下移动所以它们都在屏幕的下面。隐藏的类型TYPE_STATUS_BAR_ADDITIONAL用于在屏幕的非常规部分即屏幕的左侧或底部显示状态栏。隐藏的类型LAST_SYSTEM_WINDOW系统窗口类型最高层级2999
下面为Android1开始的窗口层级从最初的10多个发展到如今的40多个层出不穷。
自定义的窗口层级
车载方案存在倒车等特殊界面需要在较高的窗口层级显示Android原有的窗口层级不满足车载需求因此都会自定义车载窗口层级。
下图为参考自定义的窗口层级
系统可以自定义窗口层级framework修改参考另一篇博客 android自定义窗口层级自定义车载系统中倒车影像显示层级
自定义窗口层级在不同Android版本中的初始层级值也是不同因此需要通过系统属性SystemProperties.getInt(ro.custom.window, 2041)来判断初始值。 例如在Android 13平台的默认ro.custom.window 属性为2401在Andoid 9等平台为2031。这样做的目的是由于跟Android原生的窗口层级存在冲突因此需要根据平台来调节初始值。 TYPE_CUSTOM_FIRST_WINDOW()为自定义初始的系统窗口层级在Android原生的窗口层级之上
TYPE_TOP_BAR和TYPE_BOTTOM_BAR在TYPE_CUSTOM_FIRST_WINDOW之上但在倒车界面之下显示。 TYPE_REVERSE_WINDOW倒车影像为的窗口层级。若要覆盖在倒车之上需要使用更高的层级或者在倒车出现后添加TYPE_CUSTOM_LAST_WINDOW。
相关文章
-
唐山市政建设总公司网站东莞星凯网络
唐山市政建设总公司网站东莞星凯网络
- 技术栈
- 2026年03月21日
-
唐山市网站建设如何做网站推广及优化
唐山市网站建设如何做网站推广及优化
- 技术栈
- 2026年03月21日
-
唐山市网站建设昆明做网站要多少钱
唐山市网站建设昆明做网站要多少钱
- 技术栈
- 2026年03月21日
-
唐山网站建设外包公司wordpress搭建的网站能干什么
唐山网站建设外包公司wordpress搭建的网站能干什么
- 技术栈
- 2026年03月21日
-
唐山网站建设怎么样网络设计课
唐山网站建设怎么样网络设计课
- 技术栈
- 2026年03月21日
-
唐山网站建设找汉狮装修设计网站有哪些
唐山网站建设找汉狮装修设计网站有哪些
- 技术栈
- 2026年03月21日


