在我的应用程序中,我有一个辅助功能服务,它可以在执行进一步操作之前获取活动窗口的根目录。相关部分如下所示:
@Override
public final void onAccessibilityEvent(AccessibilityEvent event) {
...
AccessibilityNodeInfo rootAccessibilityNode = getRootInActiveWindow();
...
}
我收到用户对ANR的投诉,堆栈跟踪指向我的getRootInActiveWindow行。
getRootInActiveWindow是否可能导致ANR,如果是,那么机制是什么?这个方法需要在它自己的线程中调用吗?文档中没有关于此的内容。
答案 0 :(得分:1)
我非常怀疑这条线是崩溃的直接原因,仍然希望看到Stack Trace。了解如何启动服务也很有帮助(开发人员对辅助功能服务的新手常常出错)。假设您已按照通常明显的答案完成了作业,我们将留下以下内容:
答:权限问题。如果您已经在root设备或其他任何设备上完成了测试,则可能是您的用户遇到了权限问题。确保您的服务混合XML文件中包含android:canRetrieveWindowContent="true"
。
B:如果您尚未过滤掉任何辅助功能事件,则会在窗口加载等之间触发事件。可能是您试图抓住不存在的内容而系统不喜欢它。这也可以通过在模拟器上进行测试来隐藏,因为它可能是竞争条件,在较慢的模拟环境中不会表现出来。这也会导致性能问题,因为节点层次结构是一个相当昂贵的事情,你不会经常这样做。尝试限制运行代码的accessibilityEventTypes。