窗口焦点丢失问题分析

2023-05-16

从slog中的systemlog可以看出如下信息:

01-01 08:29:03.732   633   936 I WindowManager: Relayout invis Window{42244420 u0 Keyguard}: mExiting=false
01-01 08:29:03.732   633  1011 D PowerManagerService: releaseWakeLockInternal: lock=1109498264 [NlpWakeLock], flags=0x0 pkg name:com.google.android.gms
01-01 08:29:03.732   633  1011 D PowerManagerService: updateSuspendBlockerLocked goto release:PowerManagerService.WakeLocks: ref count=1
01-01 08:29:03.732   633  1011 D PowerManagerService: Releasing suspend blocker "PowerManagerService.WakeLocks".
01-01 08:29:03.732   633   936 I WindowManager: Releasing surface in: Window{42244420 u0 Keyguard EXITING}
01-01 08:29:03.732   633   936 D WindowManager: Input focus has changed to null
01-01 08:29:03.752   633   644 D PowerManagerService: acquireWakeLockInternal: lock=1109498264, flags=0x1, tag="NlpWakeLock", ws=null, uid=10025, pid=968 pkg name:com.google.android.gms
01-01 08:29:03.752   633   644 D PowerManagerService: updateSuspendBlockerLocked goto acquire:PowerManagerService.WakeLocks: ref count=0
01-01 08:29:03.752   633   644 D PowerManagerService: Acquiring suspend blocker "PowerManagerService.WakeLocks".
01-01 08:29:03.762   633   648 I WindowManager: Focus moving from Window{42244420 u0 Keyguard EXITING} to null
01-01 08:29:03.762   633   648 I WindowManager: Losing focus: Window{42244420 u0 Keyguard EXITING}
01-01 08:29:03.792   633   648 D WindowManager: Input focus has changed to Window{42242428 u0 com.android.phone}
01-01 08:29:03.832   633   786 D PowerManagerService: acquireWakeLockInternal: lock=1110600800, flags=0x1, tag="UlrDispatchingService", ws=null, uid=10025, pid=968 pkg name:com.google.android.gms


可以使用针对一些系统窗口进行测试验证,
常见的系统窗口:
长按关机键出现的对话框
statusbar下拉框
低电警告
锁网
anr提示框
。。。

具体:
WindowManager.java中
public static final int TYPE_STATUS_BAR         = FIRST_SYSTEM_WINDOW;
。。。
public static final int LAST_SYSTEM_WINDOW      = 2999;


这之间的窗口类型全是系统窗口


原因已查明:
两个不同层级的系统级dialog开出顺序加上keyguard的特殊性导致了窗口focus错误
1.窗口堆栈初始状态:
...
keyguard
wallpaper
launcher
...
2.开出低电量后,由于低电警告层级>wallpaper,所以变化为:修改后与3一样
...
keyguard
low_battery
wallpaper
launcher
...
3.由于墙纸窗口的特殊性,总是显示在需要显示墙纸窗口(这里是keyguard)的下面,所以调整为:
...
keyguard
wallpaper
low_battery
launcher
...
4.开出锁网后,由于锁网窗口层级>wallpaper,所以 变化为:
...
keyguard
sim_lock
wallpaper
low_battery
launcher
...​
修改后:
keyguard
wallpaper
low_battery
sim_lock
launcher
5.墙纸窗口的特殊性,总是显示在需要显示墙纸窗口(这里是keyguard)的下面,所以调整为:
...
keyguard
wallpaper
sim_lock
low_battery
launcher
...​
虽然锁网层级<低电警告层级,但是堆栈中位置确到了低电之上,WMS寻找focus窗口的时候是按堆栈顺序查找,也就造成了最终focus在了锁网上,但低电警告显示在锁网之上


修改方案有两种:
1.锁网比低电后开出才有此问题,可以在锁网开出的时候发广播关闭低电警告(建议采用此规避方案,但是由于其他dialog也会出现该问题,故未采用该方案)
2.wms添加系统窗口修改,堆栈中碰到wallpaper窗口,直接pass,继续寻找,此方案修改方法如下:
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService
index 6099cfa..eebe4b4 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -1075,6 +1075,9 @@ public class WindowManagerService extends IWindowManager.Stub
         int i;
         for (i = windows.size() - 1; i >= 0; i--) {
             if (windows.get(i).mBaseLayer <= myLayer) {
+                if (windows.get(i).mIsWallpaper) {
+                    continue;
+                }
                 break;
             }
         }


谢谢!

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

窗口焦点丢失问题分析 的相关文章

  • 完善二叉树的右指针

    对于一个二叉树 xff0c 每个结点有三个指针 xff0c 除了左右子节点指针外还有一个指向右边的结点的指针 现在给定一个二叉树 xff0c 每个结点的右指针为空 xff0c 让你把每一层的结点都连起来 xff08 默认是完全二叉树 xff
  • 什么是AOSP?

    AOSP全名为Android Open Source Project xff0c 中文为安卓开源项目 xff0c 开源即开放源代码 Android是一个基于Linux xff0c 由Google主导的开源系统 严格意义上来说 xff0c A
  • 什么是APT攻击

    什么是APT攻击 APT攻击即高级可持续威胁攻击 也称为定向威胁攻击 xff0c 指某组织对特定对象展开的持续有效的攻击活动 APT是黑客以窃取核心资料为目的 xff0c 针对客户所发动的网络攻击和侵袭行为 xff0c 是一种蓄谋已久的 恶
  • CEO、COO、CFO、CTO、CMO是什么意思

    一 什么是CEO COO CFO CTO xff1f CEO总裁 CFO财务总监 CTO技术总监 COO运营总监 CEO Chief Executive officer 首席执行官 可以理解为是企业领导人和职业经理人两种身份的合一 xff0
  • POC测试是什么

    POC测试 xff0c 即Proof of Concept 可以理解为 xff1a 根据客户需求进行测试 是业界流行的针对客户具体应用的验证性测试 xff0c 根据用户对采用系统提出的性能要求和扩展需求的指标 xff0c 在选用服务器上进行
  • 开发环境、测试环境、生产环境

    生产环境 是可以对外开放 xff0c 已通过测试验证 xff0c 对外提供服务的环境 开发环境 程序员做开发的环境 xff0c 该环境已经部署好需要的开发工具和服务 测试环境 一般是从生产环境复制过来的环境 xff0c 用于要发布的服务 业
  • Yml的基本配置(服务器端口、日志、JPA、Druid、环境激活、thymeleaf、resource)

    springboot配置文件很强大 也丰富 xff0c 约定优于配置 xff0c 只需做少量的配置 xff0c 其它采用默认的就行 application properties xff08 传统 xff09 xff0c applicatio
  • 使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密

    一 使用系统自带的工具BitLocker实现 Bitlocker是属于win7版本以后有的系统功能 Windows BitLocker驱动器加密通过加密Windows操作系统卷上存储的所有数据可以更好地保护计算机中的数据 BitLocker
  • k8s的dashboard无法正常访问

    本场景为使用google浏览器访问vmware搭建的虚拟机 建议使用google浏览器的无痕模式 网页提示信息Client sent an HTTP request to an HTTPS server 原因 xff1a 因为直接使用ip
  • k8s删除pod失败,一直处于deleted的界面

    我们在删除pod的时候出现以下情况 xff1a span class token comment 删除pod span span class token punctuation span root 64 master1 yaml span
  • journalctl命令

    journalctl简介 journalctl命令是Systemd的 个命令 xff0c 是用来管理查看日志信息的 因为日志的信息多 xff0c 复杂 xff0c journalctl命令用参数的方式来帮助用户更快地定位日志 注释 xff1
  • 如何在微信小程序里使用Lottie动画库

    先看效果图 xff1a 前言 xff1a 微信小程序的lottie动画库是按照lottie web动画库改造而来 参考lottie web xff1a https github com airbnb lottie web xff0c 以及官
  • mysql中grant all privileges on赋给用户远程权限

    mysql中grant all privileges on赋给用户远程权限 改表法 当你的帐号不允许从远程登陆 xff0c 只能在localhost连接时 这个时候只要在mysql服务器上 xff0c 更改 mysql 数据库里的 user
  • Shell之function函数的定义及调用

    文章目录 96 function 96 函数的定义及调用 96 function 96 函数的定义 96 function 96 函数的调用 位置传参 函数使用return返回值 位置传参 函数的调用 数组传参 function函数的定义及
  • springboot集成activeMQ实现Queue队列

    1 首先下载 activeMQ地址 xff1a https activemq apache org 下载完成以后 xff0c 进行启动 启动步骤很简单 xff0c 就tomcat差不多 这里要注意 xff0c 看你电脑是32位还是64位 x
  • Docker Desktop Vmmem内存占用过高问题解决方案

    Docker Desktop Vmmem内存占用过高问题解决方案 内存占用过高原因 主要原因是docker desktop的实现及基于wsl Windows子系统 相当于在Windows上同时开了一个虚拟机 如果不对wsl的资源进行限制 它
  • spring mvc 预习

    spring mvc 概述 Web 框架 xff0c 是目前最主流的 MVC 框架之一 Spring3 0 后全面超越 Struts2 xff0c 成为最优秀的 MVC 框架 Spring MVC 通过一套 MVC 注解 xff0c 让 P
  • windows server 2012 进程 出现大量桌面窗口管理器的 解决方法

    windows server 2012 进程 出现 桌面窗口管理器 打开运行 打Cmd xff0c 执行 taskkill f im winlogon exe t 记住 这个命令会让远程桌面黑屏 xff0c 不要着急 xff0c 远程按下C
  • 在线医疗系统(毕设)

    小白的成长之路从自己写毕设开始 从整个设计说明书中截取了一部分 相关技术 Springboot VUE MySQL数据库 Bootstrap AJAX 融云 shiro等总体设计 数据库相关表设计 数据库截图了一张图 详细设计与实现 系统整
  • Android 终极推送方案(结束应用进程依然可以接收通知)

    开发中总会遇到产品经理需求是 xff1a 结束掉应用依然想接收到通知 xff0c iOS轻而易举就可以实现 xff0c 但Android一直都是杀掉应用后就无法接收到通知 xff01 网上给的结果大概是 xff1a 1 集成各大厂商的推送s

随机推荐