Android:辅助功能服务中的 getRootInActiveWindow 会导致 ANR 吗?

标签 android performance accessibility android-anr-dialog accessibilityservice

在我的应用程序中,我有一个可访问性服务,它在执行进一步操作之前获取 Activity 窗口的根目录。相关部分如下所示:

    @Override
    public final void onAccessibilityEvent(AccessibilityEvent event) {
    ...
    AccessibilityNodeInfo rootAccessibilityNode = getRootInActiveWindow();
    ...
    }

我收到用户关于 ANR 的投诉,堆栈跟踪将我指向 getRootInActiveWindow 行。

getRootInActiveWindow 是否可能导致 ANR,如果是,机制是什么?这个方法需要在它自己的线程中调用吗?文档中没有关于此的内容。

最佳答案

我很怀疑这一行是崩溃的直接原因,还是想看看Stack Trace。了解您如何启动您的服务也很有帮助(刚接触无障碍服务的开发人员经常犯这个错误)。假设您已经完成了通常显而易见的答案的作业,我们还剩下以下内容:

答:权限问题。如果您在已获得 root 权限的设备或其他设备上完成测试,则可能是您的用户遇到了权限问题。确保您的服务配置 XML 文件中有 android:canRetrieveWindowContent="true"

B:如果您没有过滤掉任何可访问性事件,则存在在窗口加载之间触发的事件等。可能是您试图获取不存在的内容而系统不喜欢它。这也可以通过在模拟器上进行测试来隐藏,因为它可能是一种竞争条件,不会在较慢的模拟环境中表现出来。这也会导致性能问题,因为遍历节点层次结构是一件相当昂贵的事情,而且您不希望经常这样做。尝试限制运行代码的 accessibilityEventTypes。

关于Android:辅助功能服务中的 getRootInActiveWindow 会导致 ANR 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44995426/

相关文章:

html - 如何为 WCAG 2.0 Compliance 标记按钮?

android - Android 上的随机 SQLiteConnectionPool 错误。如何避免?

javascript - .prop() VS .val() .使用 jQuery 设置输入文本值

performance - Google apps 脚本 - 加速 getActiveDocument()?

php - rowCount() 作为变量或直接将其包含在 if 语句中哪个更好?

javascript - 如何让屏幕阅读器停止将 HTML5 游戏视为文档?

html - 一个标签内的两个输入字段

java - 当父级不是 Activity 而是 Fragment 时,选项卡为空

Android 查找当前位置错误

android - 如何通过单击 Flutter 中屏幕的其他区域来管理警报对话框?