Java AccessibilityNodeInfo的生命周期是什么?

Java AccessibilityNodeInfo的生命周期是什么?,java,android,accessibilityservice,Java,Android,Accessibilityservice,我正在开发一款Android应用程序,它包括一个辅助功能服务,允许用户创建“宏”,可以快速自动地执行他们经常使用的第三方应用程序的任务(他们不必与一些对讲服务交互,在那里他们等待事情被列出,然后不得不在一个非常缓慢的过程中一遍又一遍地说出他们想要做的每件事)。我的问题是,我似乎找不到关于AccessibilityNodeInfo对象生命周期的详细文档。例如,如果宏设置为“打开此应用程序并单击“转到”按钮,然后列出所有结果"我可能需要等待并在应用程序中收集增量更新,因为结果可能会出现在多个窗口内容

我正在开发一款Android应用程序,它包括一个辅助功能服务,允许用户创建“宏”,可以快速自动地执行他们经常使用的第三方应用程序的任务(他们不必与一些对讲服务交互,在那里他们等待事情被列出,然后不得不在一个非常缓慢的过程中一遍又一遍地说出他们想要做的每件事)。我的问题是,我似乎找不到关于AccessibilityNodeInfo对象生命周期的详细文档。例如,如果宏设置为“打开此应用程序并单击“转到”按钮,然后列出所有结果"我可能需要等待并在应用程序中收集增量更新,因为结果可能会出现在多个窗口内容更改事件中,每个事件只包含应用程序正在构建的总结果列表的一个子集。我可以使用findViewById之类的工具获取我想要的元素,但在多个事件中保留这些元素是个坏主意,因为android操作系统可以在任何时候使它们失效/更改?我想知道是否有我错过的文档/示例可以更清楚地说明如何最好地与accessibilityNodeInfo对象交互,以及如何/如果我可以随着时间的推移缓存或收集它们以获得应用程序布局中更完整和一致的图片

我看过其他关于accessibilitynodeinfo的帖子,比如(),但这仍然没有回答诸如节点何时无效,或者如果我不回收节点并稍后尝试使用它会发生什么(特别是如果应用程序已删除该元素)。我想回答的问题如下所示:

//用于缓存节点…坏主意?
HashMap cachedNodes=新HashMap();
//由于许多原因被激发,可能包含整个应用布局层次结构的任意子集(显示上限由屏幕上可见的内容限定)
@凌驾
AccessibilityEvent上的公共无效(AccessibilityEvent事件){
//我的辅助功能服务正在侦听所有事件类型
AccessibilityNodeInfo nodeInfo=event.getSource();
//有时节点完全为空…为什么??
if(nodeInfo!=null){
//这到底在做什么?为什么这个节点有时不同于使用getParent()手动遍历层次结构?
rootNode=getRootInActiveWindow();
if(rootNode==null){
rootNode=nodeInfo;
AccessibilityNodeInfo parent=nodeInfo.getParent();
while(父级!=null){
rootNode=父节点;
parent=rootNode.getParent();
}
}
//无论在哪个节点上调用,该方法都会返回事件层次结构中的所有匹配项?
List nodesofinderest=rootNode.findAccessibilityNodeInfosByViewId(“package.name/id_of_nodes_i_want”);
对于(AccessibilityNodeInfo节点:NodeFinTerest){
//我的辅助功能服务设置为能够获取视图ID和检索窗口内容,但视图ID不是唯一的
//可能必须根据节点的视图类型沿袭组成ID?
if(!cachedNodes.containsKey(getUniqueID(节点)){
cachedNodes.put(getUniqueID(node),node);
}
}
}
}

AccessibilityNodeInfo或AccessibilityNodeInfoCompat
(用于backword兼容性) 这不是观点

当您打开手机的任何一个屏幕时,其被调用窗口的内容将显示为可访问性节点信息树

有时会将
AccessibilityNodeInfo
设置为null,但在刷新后,可以获取该特定节点的值

accessibilityNodeInfo.refresh();
用它所代表的视图的最新状态刷新此信息


您可以访问此网站以获取更多信息。

AccessibilityNodeInfo或AccessibilityNodeInfoCompat
(用于backword兼容性) 这不是观点

当您打开手机的任何一个屏幕时,其被调用窗口的内容将显示为可访问性节点信息树

有时会将
AccessibilityNodeInfo
设置为null,但在刷新后,可以获取该特定节点的值

accessibilityNodeInfo.refresh();
用它所代表的视图的最新状态刷新此信息


您可以访问此链接以获取更多信息。

但是如果我对空引用调用refresh(),这不会引发错误吗?您必须刷新父节点,而不是该特定节点。但是如果我对空引用调用refresh(),这不会引发错误吗?您必须刷新父节点,而不是该特定节点。