关于征求网站建设的意见工地包工接活十大平台

pingmian/2026/1/21 9:13:34/文章来源:
关于征求网站建设的意见,工地包工接活十大平台,大型网站制作怎么样,计算机软件工程师证怎么考Android 的 WMS#xff08;Window Manager Service#xff09;是一个关键组件#xff0c;负责管理窗口的创建、显示、布局和交互等。Window 的操作有两大部分#xff0c;一部分是 WindowManager 来处理#xff0c;一部分是 WMS 来处理#xff0c;如下图所示#xff1a; …        Android 的 WMSWindow Manager Service是一个关键组件负责管理窗口的创建、显示、布局和交互等。Window 的操作有两大部分一部分是 WindowManager 来处理一部分是 WMS 来处理如下图所示 WindowManager 中通过 WindowManagerGlobal 创建 ViewRootImpl 也就是 View 的根。在 ViewRootImpl 中完成对 View 的绘制等操作然后通过 IPC 获取到 Session最终通过 WMS 来进行处理。WindowManager 部分的管理流程前面已经介绍这里我们来看一下 WMS 对 Window 的管理。 一、调用流程 1、WM到WMS 我们都知道 Window 的添加最后是通过 ViewRootImpl.addTodisplay 方法来完成的我们先来看一下 ViewRootImpl 源码位置/frameworks/base/core/java/android/view/ViewRootImpl.java final IWindowSession mWindowSession;public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView, int userId) {synchronized (this) {if (mView null) {……try {……res mWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes,getHostVisibility(), mDisplay.getDisplayId(), userId,mInsetsController.getRequestedVisibility(), inputChannel, mTempInsets,mTempControls);}……}} }这里调用了 mWindowSession.addToDisplayAsUser 来完成最后的添加可以看到  IWindowSession 是一个接口类真正实现该接口的是 Session 类。 Session 源码位置/frameworks/base/services/core/java/com/android/server/wm/Session.java final WindowManagerService mService;Override public int addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs,int viewVisibility, int displayId, int userId, InsetsState requestedVisibility,InputChannel outInputChannel, InsetsState outInsetsState,InsetsSourceControl[] outActiveControls) {return mService.addWindow(this, window, attrs, viewVisibility, displayId, userId,requestedVisibility, outInputChannel, outInsetsState, outActiveControls); } 可以看到最终是通过 WMS 来完成添加的。需要注意的是WMS 并不关心 View 的具体内容他只关心各个应用显示的界面大小、层级值等这些数据到包含在 WindowManager.LayoutParams 中。也就是上面的 atrs 属性。 addWindow 的第二个参数是一个 IWindow 类型这是 App 暴露给 WMS 的抽象实例在 ViewRootImp 中实例化与 ViewRootImpl 一一对应同时也是 WMS 向 App 端发送消息的 Binder 通道。 二、WMS窗口添加 WindowManagerService 源码位置/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility,int displayId, int requestUserId, InsetsState requestedVisibility,InputChannel outInputChannel, InsetsState outInsetsState,InsetsSourceControl[] outActiveControls) {Arrays.fill(outActiveControls, null);int[] appOp new int[1];final boolean isRoundedCornerOverlay (attrs.privateFlags PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY) ! 0;// 1.检查权限mPolicy的实现类是PhoneWindowManager。int res mPolicy.checkAddPermission(attrs.type, isRoundedCornerOverlay, attrs.packageName, appOp);if (res ! ADD_OKAY) {return res;}……synchronized (mGlobalLock) {……// 2.通过displayId获取Window要添加到哪个DisplayContent。final DisplayContent displayContent getDisplayContentOrCreate(displayId, attrs.token);if (displayContent null) {// 没有找到对应的显示屏幕return WindowManagerGlobal.ADD_INVALID_DISPLAY;}……// 3.判断type的窗口类型(100-1999)如果是子类型必须要有父窗口并且父窗口不能是子窗口类型。if (type FIRST_SUB_WINDOW type LAST_SUB_WINDOW) {parentWindow windowForClientLocked(null, attrs.token, false);if (parentWindow null) {// 试图添加带有非窗口令牌的窗口return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;}if (parentWindow.mAttrs.type FIRST_SUB_WINDOW parentWindow.mAttrs.type LAST_SUB_WINDOW) {// 试图添加带有子标记的窗口return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;}}……ActivityRecord activity null;final boolean hasParent parentWindow ! null;// 4.对子窗口使用与父窗口使用的令牌因此我们可以对它们应用相同的策略。WindowToken token displayContent.getWindowToken(hasParent ? parentWindow.mAttrs.token : attrs.token);// 如果这是一个子窗口与父窗口类型相同的检查规则。final int rootType hasParent ? parentWindow.mAttrs.type : type;boolean addToastWindowRequiresToken false;// 5. token为null。if (token null) {if (hasParent) {// 对子窗口使用现有的父窗口令牌。token parentWindow.mToken;} else if (mWindowContextListenerController.hasListener(windowContextToken)) {// 如果用户提供的话尊重窗口上下文令牌final IBinder binder attrs.token ! null ? attrs.token : windowContextToken;final Bundle options mWindowContextListenerController.getOptions(windowContextToken);token new WindowToken.Builder(this, binder, type).setDisplayContent(displayContent).setOwnerCanManageAppTokens(session.mCanAddInternalSystemWindow).setRoundedCornerOverlay(isRoundedCornerOverlay).setFromClientToken(true).setOptions(options).build();} else {// 6.且不是应用窗口或者是其他类型的窗口则窗口就是系统类型(例如 Toast)。// 进行隐式创建 WindowToken这说明我们添加窗口时是可以不向WMS提供WindowToken的。final IBinder binder attrs.token ! null ? attrs.token : client.asBinder();token new WindowToken.Builder(this, binder, type).setDisplayContent(displayContent).setOwnerCanManageAppTokens(session.mCanAddInternalSystemWindow).setRoundedCornerOverlay(isRoundedCornerOverlay).build();}} else if (rootType FIRST_APPLICATION_WINDOW rootType LAST_APPLICATION_WINDOW) {// 7、判断是否为应用窗口如果是将WindowToken转换为应用程序窗口的ActivityRecord。activity token.asActivityRecord();if (activity null) {// 试图添加带有非应用程序令牌的窗口return WindowManagerGlobal.ADD_NOT_APP_TOKEN;} else if (activity.getParent() null) {// 试图添加具有退出应用程序的窗口return WindowManagerGlobal.ADD_APP_EXITING;} else if (type TYPE_APPLICATION_STARTING) {if (activity.mStartingWindow ! null) {// 试图用已经存在的开始窗口向令牌添加开始窗口return WindowManagerGlobal.ADD_DUPLICATE_ADD;}if (activity.mStartingData null) {// 试图向令牌添加起始窗口但已被清除return WindowManagerGlobal.ADD_DUPLICATE_ADD;}}} else if (rootType TYPE_INPUT_METHOD) {if (token.windowType ! TYPE_INPUT_METHOD) {// 试图添加带有错误令牌的输入法窗口return WindowManagerGlobal.ADD_BAD_APP_TOKEN;}}……// 8.创建WindowState保存窗口的所有状态信息在WMS中WindowState与窗口是一一对应的关系。final WindowState win new WindowState(this, session, client, token, parentWindow,appOp[0], attrs, viewVisibility, session.mUid, userId, session.mCanAddInternalSystemWindow);// 9.判断请求添加窗口的客户端是否已经死亡如果死亡则不会执行下面逻辑。if (win.mDeathRecipient null) {return WindowManagerGlobal.ADD_APP_EXITING;}if (win.getDisplayContent() null) {return WindowManagerGlobal.ADD_INVALID_DISPLAY;}final DisplayPolicy displayPolicy displayContent.getDisplayPolicy();// 10.根据窗口的type类型对窗口的LayoutParams的一些成员变量进行修改。displayPolicy.adjustWindowParamsLw(win, win.mAttrs);win.updateRequestedVisibility(requestedVisibility);// 11.准备将窗口添加到系统中res displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);if (res ! ADD_OKAY) {return res;}……// 12.将WindowState添加到mWindowMap中mWindowMap是各种窗口的集合。mWindowMap.put(client.asBinder(), win);……boolean imMayMove true;// 13.添加窗口。将WindowState添加到对应的WindowToken中实际上就是保存在WindowToken的父类 WindowContainer这样WindowToken就包含了相同组件的WindowState。win.mToken.addWindow(win);}return res; } WMS 的 addWindow 方法返回的是 addWindow 的各种状态例如添加成功、失败、无效的 display 等这些状态定义在 WindowManagerGloabl 中 。 通过上面的流程App 到 WMS 注册窗口的流程就完了WMS 为窗口创建了用来描述状态的 WindowState接下来就会为新建的窗口显示次序然后再去申请 Surface才算是真正的分配了窗口。 这里对 WMS 的 addWindow 流程做一个总结 首先检查权限 接着从 mRootRootWindowContainer中获取 DisplayContent 如果没有就会根据 displayId 创建一个新的 DisplayContent 接着就是 type 类型的判断如果是子类型就必须要获取到他的父窗口 接着使用 DisplayContent 获取当前或者父窗口获取 token如果为 null 就排除子窗口和其他的窗口剩下的就是可以不用携带 token 的窗口WMS 会隐式的创建窗口 token。如果不等于 null 就判断是应用窗口就将 token 转为 ActivityRecord后面还有一大堆窗口判断只要是不满足就直接 return。 类型判断完成后就会创建 WindowState并且传入 WMS、IWindow、token 等。WindowState 里面保存了窗口的所有信息。WindowState 与窗口一一对应。 接着就执行调用了 WindowState 的 attache 、initAppOpsState 等方法。WindowState 创建完成后就会被添加到 mWindowMap 中可以 IWindow 的 Binder 为 keyWindowState 为 value 添加进去。 最后就是 win.mToken.addWindow(win) 然后将 WindowState 添加到 WindowToken 中。因为 WindowToken 是可以复用的所以这里的关系就是每个 WindowToken 都会保存对应的 WindowState而每个 WindowState 也都会都持有 WindowToekn。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

株洲的网站建设响应式网站排名如何

1、同一个bank下如果有多个threads access 不同的地址,就会出现bank conflicts, 2、如果是多个threads read 同一个bank内的同一个地址,就是broadcast 模式没有bank conflicts,这种情况下带宽利用率较低,因为只用了一个bank资源…

安阳网站关键词优化gta买办公室网站建设中

目录 算法的执行效率和资源消耗、时间和空间复杂度分析 执行效率和资源消耗 时间复杂度分析 空间复杂度分析 实际应用 面试技巧 根据实际场景,选用合适的数据结构和算法进行程序设计 所根据原则 实例 如何选择数据结构示例 合适的数据结构:哈…

西安教育类网站建设公司建站助手官网

于今天的新生代父母而言,在诸多消费观念被改变的当下,新生父母们在育儿上更强调精细化,在这种情况下,母婴市场的消费升级已是大势所趋。不过,在如今收入增速整体放缓的背景下,各细分赛道的消费升级都出现了…

做网站推广方法有哪些长沙黄花机场公众号

发现自身数字化滞后的公司正在遭受因为在二十年前所做的战略决策的煎熬。这里我们将阐述如何才能迎头赶上。 发展数字化战略的公司正在努力促进转型,因为大多数首席信息官(CIO)还没有能力成为数字化领导者。根据Caldwell Partners公司的技术、数字和数据领导事务的管…

上海营销型网站建设费用wordpress后台可视化编辑器

在Redis中设置一个键值对并为其指定过期时间,可以使用 SET 命令结合 EXPIRE 命令来实现,或者直接使用 SETEX 命令。 以下是使用 SET 和 EXPIRE 命令的例子: SET mykey somevalue EXPIRE mykey 30上面的命令首先使用 SET 命令创建了一个名为…

做公众号选择图片的网站无锡网络推广哪家好

昨天刚写完侧滑菜单的实例,今天在CocoaChina网站上看到一篇非常好的侧滑菜单设计案例文章,分享给大家。http://www.cocoachina.com/macdev/uiue/2013/0716/6609.html 自从Facebook使用了左右滑动菜单导航以后,国内外各个App都竞相模仿该功能&…

做两个阿里网站一般可以在哪些网站做推广

1005 继续(3n1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候,我们…

dw中怎样做网站二级页面本地网站建设电话

随着科技的飞速发展,全球软件开发大会(QCon)作为行业领先的技术盛会,为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等,共同探讨软件开发的最新趋势、技术与实践。本…

北京正规网站建设有几种企业建站划算吗

pinia的使用跟vuex很像,去除了很多没用的api,写法有两种,一种老式的选项式api还有一种组合式api,用哪种根据自己喜好来,以下示例为组合式api 更多教程参考官网:pinia官网https://pinia.vuejs.org/zh/ 安装…

网站维护一般多久网站空间去哪买

一、函数sigqueue sigqueue函数原型: 函数作用:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用 int sigqueue(pid_t pid, int signo, const union sigval v…

买了网站 怎么做呢全球速卖通官网

清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦直入主题:我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象?使用内连接,查询数据问题&…

网站制作好吗广告公司经营范围

使用VSCode作为Vue项目的开发环境后,我们需要了解如何打包Vue项目。本文将从多个方面对如何在VSCode中打包Vue项目进行详细阐述。 一、安装依赖 在打包Vue项目之前,我们需要先安装项目所需的依赖。在Vue项目中,可以通过以下命令安装依赖&am…

营销型网站建设公司网络推广建设网站的企业邮箱

一、基于结构特征的相似性度量 将特征看作向量空间中的点,通过计算两个点或者两个点组之间的距离来度量他们是否相似。 一阶度量:minkowsky距离、马氏距离 二阶度量:特征点本身有相关性,所以将特征点对之间的关系加入到相似性度量…

网站中的搜索功能怎么做的wordpress水印图片插件

709.转成小写字母 题目链接:709.转成小写字母 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例 1: 输入:s “Hello” 输出:“hello” 示例 2: 输入&am…

西安年网站建设抖抈app软件下载

摘要 获取客户端ip地址&#xff0c;然后使用这个ip地址获取所在的国家、省份、城市&#xff0c;可以在网站中实现IP属地&#xff0c;发布地等功能。 本文的获取IP地址信息均采自网络上免费的IP查询网站&#xff0c;通过其API或者网页HTML解析出的ip地址信息。 代码 <?p…

哪个网站做简历免费网络推广公司

有一天&#xff0c;我的同事问我&#xff0c;他应该如何做一个快速预测模型而不是Excel&#xff0c;并产生比线性回归或Excel图中的那些简单方程更好的结果。这是我的答案。 TableCurve 2D (Image by author) Sigmaplot很早以前就推出了这个软件。它已被广泛用于在数据中寻找最…

重庆价格低建设网站公司中山市企业网站seo哪里好

作者&#xff1a;http://m.jb51.net/article/48304.htm?fromtimeline&isappinstalled0本教程将Java8的新特新逐一列出&#xff0c;并将使用简单的代码示例来指导你如何使用默认接口方法&#xff0c;lambda表达式&#xff0c;方法引用以及多重Annotation&#xff0c;之后你…

网站建设与制作与维护昌大建设集团大老板

构建明智的错误处理工作流程需要什么&#xff1f; 生产异常处理是一门黑暗的科学。 一旦您的代码投入生产&#xff0c;任何小的缺陷或故障都可以转化为数百万个日志事件。 尤其是在将异常作为控制流的一部分使用的情况下。 它是研究最少的主题&#xff0c;对您的应用程序的行…

专门做油画交流的网站做动漫网站侵权吗

来源&#xff1a;立委NLP频道图灵测试的实质就是要让人机交互在限定时间内做到真假莫辨。玩过GPT3的同学们都清楚&#xff0c;其实这一点已经做到了。从这个角度看&#xff0c;图灵测试已经过时了。区别人和机器&#xff0c;需要寻找其他的标准。今天就唠一唠正在风口上的预训练…