温馨提示:这篇文章已超过428天没有更新,请注意相关的内容是否还可用!
摘要:本文介绍了Android系统中的窗口焦点概念。窗口焦点是指用户在操作Android设备时,当前所操作的界面或应用程序窗口的焦点位置。了解窗口焦点的概念和运行机制,对于开发高效、用户友好的Android应用程序至关重要。本文简要阐述了窗口焦点的获取、失去和转移等基本情况,为开发者提供了参考。
背景
我们经常会遇到一种名为的ANR异常,这种异常通常是由于缺少焦点窗口FocusedWindow导致的,并且这类异常只会发生在key事件的派发过程中,因为key事件需要找到一个焦点窗口然后再进行派发,而触摸事件只需要找到当前显示的窗口即可。
焦点窗口设定
WMS(窗口管理服务)只管理窗口,无法确定是否有窗口盖住当前画面,而SurfaceFlinger负责显示管理,最贴近用户看到的画面,可以知晓是否有窗口盖住当前画面,并根据真实的显示窗口设置对应的window信息给InputDispatcher。
关键日志
在解决此类问题时,我们需要关注以下几个关键日志:
窗口(window)
通过执行"dumpsys window"命令,我们可以查看mCurrentFocus和mFocusedApp的信息,其中mCurrentFocus指的是当前的焦点窗口,mFocusedApp指的是当前的焦点Activity,我们还需要查看是否有LAST ANR。
SurfaceFlinger
通过执行"dumpsys SurfaceFlinger"命令,我们可以查看HWC layers的信息,[Focused]这一列如果有带[*]号,则说明是焦点窗口。
input
执行"dumpsys input"命令后,我们要关注FocusedApplications和FocusedWindows的信息,如果发生ANR,焦点窗口的信息主要以此为准,我们还需要查看event log,以确认焦点窗口的变化和事件的派发情况。
针对此类问题的分析方法如下:
1、确认焦点所在的窗口,我们可以在Event.log中查找input_focus,同时查看dumpsys SurfaceFlinger、dumpsys window和dumpsys input中的相关信息,对比正常和异常时的窗口焦点是否在同一窗口。
2、分析事件是否正常派发,如果事件有正常派发,我们需要进一步分析。
3、对比应用View树的绘制,可以使用"adb shell dumpsys activity -v top > top.txt"命令对比正常和异常时的View树,以确认是否点击到了正确的View上,或者是否存在透明窗口等问题。
4、寻找其他异常点,比如查看一些异常日志等。
通过以上步骤,我们可以更准确地定位问题并找到解决方案。
还没有评论,来说两句吧...