在我的应用程序中,我有一个可访问性服务,它在执行进一步操作之前获取 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/