Android窗口层级(Window Type)分析
前言
Android的窗口Window分为三种类型:
应用Window,比如Activity
、Dialog
;子Window,比如PopupWindow
;系统Window,比如Toast
、系统状态栏、导航栏等等。
应用Window的Z-Ordered最低,就是在系统中的显示层级最低,然后到子Window,层级最高的是系统Window。层级高的Window会覆盖层级低的Window。 要让窗口覆盖显示,只需要使它的层级比上个窗口高。
三种窗口对应不同的WindowToken
,每个应用组件(应用组件可以是Activity
、InputMethod
、Wallpaper
等,每个组件对应一个WindowToken
)都需要通过WindowToken
向WMS申请添加窗口,WMS(WindowManagerSerivce
)通过根据窗口的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
实际上就是个FrameLayout
,setContentView()
的子布局最终会添加到DecorView
中,DecorView
为当前窗口的根视图。
这个根视图是如何最终被绘制出来的?
Window
表示一个抽象窗口的概念,是View
的直接管理者,对应一个View
,Window
和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:name="android.permission.SYSTEM_ALERT_WINDOW" />
下面为系统窗口层级类型:
窗口类型 | 描述 |
---|---|
FIRST_SYSTEM_WINDOW | 系统的窗口类型,起始值2000 |
TYPE_STATUS_BAR | 状态栏。只能有一个状态栏窗口;在屏幕的顶部,所有其他窗口都向下移动,所以它们在屏幕的下面。可通过参数设置全屏。 |
TYPE_SEARCH_BAR | 搜索栏。只能有一个搜索栏窗口;在屏幕的顶部。在StatusBar上显示 |
TYPE_PHONE | 电话窗口,例如来电通话。在应用窗口之上,但位于状态栏的后面。已过时,用TYPE_APPLICATION_OVERLAY替代 |
TYPE_SYSTEM_ALERT | 系统警告窗口,如低电量警告弹框。已过时,用TYPE_APPLICATION_OVERLAY替代。 |
TYPE_KEYGUARD | 锁屏窗口。不生成引用的接口。 |
TYPE_TOAST | Toast临时通知窗口。已过时,用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 | 从状态栏上滑出的面板,例如SystemUIDialog,SystemUI的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
。
相关文章:
Android窗口层级(Window Type)分析
前言 Android的窗口Window分为三种类型: 应用Window,比如Activity、Dialog;子Window,比如PopupWindow;系统Window,比如Toast、系统状态栏、导航栏等等。 应用Window的Z-Ordered最低,就是在系…...
微信小程序基础加强总结
本篇文章给大家带来了关于微信小程序的相关问题,其中主要介绍了一些基础内容,包括了自定义组件、样式隔离、数据、方法和属性等等内容,下面一起来看一下,希望对大家有帮助。 1、自定义组件 1.1、创建组件 在项目的根目录中&…...
【JAVA - List】差集removeAll() 四种方法实现与优化
一、场景: 二、结论: 1. 四种方法耗时 三、代码: 一、场景: 求差集 List1 - Lsit2 二、结论: 1. 四种方法耗时 初始条件方法名方法思路耗时 List1.size319418 List2.size284900 List..removeAll(Lsit2)1036987ms…...
sql注入基本概念
死在山野的风里,活在自由的梦里 sql注入基本概念 MYSQL基本语法union合并查询2个特性:order by 排序三个重要的信息 Sql Server MYSQL 基本语法 登录 mysql -h ip -u user -p pass基本操作 show databases; 查看数据库crea…...
AIGC系列:1.chatgpt可以用来做哪些事情?
上图的意思:神器轩辕剑 那么,在现在AI盛行的信息时代, 你是否知道如何获得和利用ChatGPT这一把轩辕剑来提升你的攻击力和生存能力呢? 故事 程序员小张: 刚毕业,参加工作1年左右,日常工作是C…...
End-to-End Object Detection with Transformers(论文解析)
End-to-End Object Detection with Transformers 摘要介绍相关工作2.1 集合预测2.2 transformer和并行解码2.3 目标检测 3 DETR模型3.1 目标检测集设置预测损失3.2 DETR架构 摘要 我们提出了一种将目标检测视为直接集合预测问题的新方法。我们的方法简化了检测流程,…...
生成多样、真实的评论(2019 IEEE International Conference on Big Data )
论文题目(Title):Learning to Generate Diverse and Authentic Reviews via an Encoder-Decoder Model with Transformer and GRU 研究问题(Question):评论生成,由上下文评论->生成评论 研…...
项目中应该使用nginx还是拦截器来封禁IP
项目中应该使用nginx还是拦截器来封禁IP 在项目中,使用 Nginx 或拦截器(例如 Spring Interceptor)来封禁 IP 地址都是可行的方法,具体选择取决于你的需求和项目架构。 Nginx 是一种高性能的 Web 服务器和反向代理服务器…...
SMB 协议详解之-NTLM身份认证
前面的文章说明了SMB协议交互的过程,在SMB交互的Session Setup Request/Response会对请求者的身份进行验证,这其中涉及到两个主要的协议NTLM以及Kerberos,本文将对NTLM协议进行详细的说明。 什么是NTLM NTLM是 NT LAN Manager (NTLM) Authentication Protocol 的缩写,主要…...
day34 Set
概述 Set也是集合Collection接口的子接口 Set也是集合Collection接口的子接口 特点:不保证元素有顺序,数组元素不可以重复 HashSet: 底层是基于HashMap的。元素是无序的。元素不可重复,去重机制是依据hashCode()和equals()方法 LinkedHas…...
数据库_之常用API的使用
数据库_之电商API MySQL C API 使用(基本函数) Mysql C API函数详解 MySQL的常用API 一个常用的程序调用MySQL数据库的时候通常都会调用以下API,下面来逐个分析. mysql_init() //函数原型 MYSQL *STDCALL mysql_init(MYSQL *mysql);这个API主要是用来分…...
CTreeCtrl自绘
CSWTreeCtrl.h) #pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl,可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl {DECLARE_DYNAMIC(CSWTreeCtrl)// 成员私有结构定义// 构造/析构函数 public:CSWTreeCtrl();virtual ~CSWTreeC…...
目标检测YOLO实战应用案例100讲-基于深度学习的可见光遥感图像目标检测
目录 前言 遥感图像目标的特点 基于深度学习的目标检测技术 2.1引言 2.2卷积神经网络...
MySQL数据库——存储引擎(2)-存储引擎特点(InnoDB、MyISAM、Memory)、存储引擎选择
目录 存储引擎特点 InnoDB 介绍 特点 文件 逻辑存储结构 MyISAM 介绍 特点 文件 Memory 介绍 特点 文件 区别及特点 存储引擎选择 存储引擎特点 上面我们介绍了什么是存储引擎,以及如何在建表时如何指定存储引擎,接下来我们就来介绍比较…...
【Vue】构建vue项目的几种方法以及区别
【Vue】构建vue项目的几种方法以及区别 1.通过vue-cli进行创建2.直接通过npm进行创建3.基于vite创建vue项目4.总结 构建vue项目时请确保已经安装node和npm 1.通过vue-cli进行创建 要用vue脚手架vue-cli创建vue项目首先我们需要全局安装一下vue-cli,安装命令如下&a…...
动态封装对象,属性来自json
需求: 如何动态的获取一个对象的字段,假如一个对象里面有name,age,sex三个字段,我想取name的值,这个name是存在一个json中,json的格式如下[{"key":"name"},{"key":"age…...
【LeetCode-中等题】90. 子集 II
文章目录 组合并集问题汇总:题目方法一:递归加回溯(去重版) 组合并集问题汇总: 1、子集非去重版本 2、组合非去重版本 3、组合去重版本 题目 本题nums数组存在重复元素,所以本题会涉及一个去重操作&#…...
Docker如何安装seafile
SQLite 方式 要在 Docker 中安装 Seafile,您可以按照以下步骤进行操作: 安装 Docker:确保您的系统上已经安装了 Docker。您可以根据您的操作系统类型,在官方网站上找到适合您系统的 Docker 版本并进行安装。 下载 Seafile 镜像&…...
注册法国商标的步骤和时间
注册法国商标的步骤如下: 1、商标查询:在提交申请之前,建议进行商标查询,以确保商标在法国市场上具有独特性和显著性。 2、提交申请:通过法国知识产权局的在线平台提交商标申请。申请时,需要提供以下文件…...
一起学数据结构(6)——栈和队列
上篇文章中,对栈的概念及特点进行了解释,并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构: 在给出队列的概念之前,先给出上篇文章中提到的栈的概念:一种只…...
【数据结构】二叉树的顺序结构-堆
【数据结构】二叉树的顺序结构-堆 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间…...
2024年java面试--mysql(2)
系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇2024年java面试–集合篇2024年java面试–redi…...
IllegalArgumentException
Caused by: java.lang.IllegalArgumentException:Invalid pulsar service : persistent 参数非法异常 这个异常是由于使用了无效的 Pulsar 服务类型导致的。Pulsar 支持不同的服务类型,例如 persistent、non-persistent 等。 当你在配置 Pulsar 相关的参数时&…...
Git 概述命令、idea中的使用
目录 Git概述 Git代码托管服务 Git常用命令 Git 全局设置 获取 Git 仓库 编辑Git 工作区中文件的状态 本地仓库操作 远程仓库操作 编辑分支操作 标签操作 在IDEA中使用Git 1.获取Git仓库 .gitignore 表示忽略 2.本地仓库操作 3.远程仓库操作 4.分支操作 Git是…...
单片机之硬件记录
一、概念 VBAT 当使用电池或其他电源连接到VBAT脚上时,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。 VCC:Ccircuit 表示电路的意思,即接入电路的电压&#x…...
QQ文件传输协议研究
引言 我们都知道,现在越来越多的应用采取了 HTTPS or TLS 传输协议,对于一般的协议,我们可以使用中间人技术对流量进行劫持转发,从而破解密文,这边可以参见我的另外一篇文章基于加密邮件协议的中间人攻防实战, 而对于 HTTPS 应用即使是我们采取中间人技术,也很难让浏览器…...
Qt/C++音视频开发51-推流到各种流媒体服务程序
一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不…...
LeetCode 35. 搜索插入位置
题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 该题我们可以采用二分查找的方式,我们可以把数组分为,小于target的一边儿和大于等于target的一边儿。 当midleft(right-left)下标所对应的数大于等于targ…...
7年经验之谈 —— Web测试是什么,有何特点?
Web测试是指对Web应用程序进行验证和评估的过程,以确保其功能、性能和安全性符合预期。 Web测试具体包括以下几个方面的内容: 功能测试:验证Web应用程序是否按照需求规格说明书中定义的功能正常工作。功能测试包括输入验证、表单提交、页面…...
【数据结构】前言概况 - 树
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章针对树形结构作出前言,以保证可以对树初步认知。 目录: 🌍前言:dz…...
临西企业做网站/乐陵seo优化
前提:知识点在理解的前提下,一定题量的针对训练,才是提高熟练度的唯一方法。 题目链接:https://vjudge.net/contest/325203#problem/E Sample Input VISIT http://acm.ashland.edu/ VISIT http://acm.baylor.edu/acmicpc/ BACK B…...
做网站资源/ 今日头条
为什么需要技术KPI 在业务技术团队,有一个不好的趋势,就是团队越来越业务,越来越没有技术味道。每个人都在谈业务,技术大会上在谈业务,周会上在聊业务,周报里写的是业务项目...... 唯独少被谈及的是技术本身…...
php做动态网站/游戏推广论坛
我有一个数据帧序列看起来像这样-a b r1 43 630 587d b c1 34 30 87我想创建一个新的数据帧,它看起来像-^{pr2}$我用了密码-appended_data pd.concat(appended_data, axis0)其中,附加的“数据”列表包含单个数据帧系列作为元素。以前当我将它与其他数据集…...
中国疫情即将放开/外贸网站seo推广教程
遇到的几个问题: 1、android-ndk-r8d/build/core/build-binary.mk:41:***target file clean has both : and :: entries. Stop 解决办法:因为在libavfilter目录中的Makefile的末尾处多了Clean这个玩意儿将其注释掉或者删掉就可以了 2、parseutils.c文件多…...
oracle数据库网站开发/今天的新闻是什么
之前tensorflow的检测环境一直没有用gpu版的 后来在python3.6cuda8.0cudnn6下装tensorflow1.2/1.3/1.4都有问题报错 ①:1.2、1.3的gpu版在import tensorflow时就直接报错 ②:1.4的TensorFlow-gpu可以import,但是在运行faster的时候就有问…...
网易企业邮箱登录页/安徽网站seo公司
在第2部分中,我将向您介绍如何使用Exchange Server中提供的新cmdlet导入/导出数据,以及如何查看导入和导出的信息统计信息这样做。走起!将数据从PST文件导入到邮箱现在是时候尝试使用New-MailboxImportRequest cmdlet 将数据从PST文件导入Exc…...