Я работаю над приложением Android, которое включает в себя службу специальных возможностей, позволяющую пользователям создавать «макросы», которые могут быстро и автоматически выполнять задачи, которые они часто выполняют, с помощью сторонних приложений, которые они уже используют (вместо того, чтобы взаимодействовать с какой-либо службой обратной связи).где они ждут, пока что-то будет внесено в список, а затем должны будут говорить все, что хотят, в очень медленном процессе (снова и снова).Моя проблема в том, что я не могу найти подробную документацию о жизненном цикле объектов AccessibilityNodeInfo.Например, если макрос настроен как «откройте это приложение и нажмите кнопку« Перейти », а затем перечислите все результаты», мне может потребоваться подождать и собирать инкрементные обновления в приложении, так как результаты могут появляться по нескольким событиям WINDOW_CONTENT_CHANGED »,каждый из которых содержит только часть общего списка результатов, который создает приложение.Я могу захватить нужные элементы с помощью таких вещей, как findViewById, но держать их рядом с несколькими событиями - плохая идея, поскольку операционная система Android может в любое время сделать их недействительными или изменить?Мне интересно, есть ли какие-нибудь документы / примеры, которые я пропустил, которые дают более четкое представление о том, как лучше взаимодействовать с объектами accessibilityNodeInfo, и как / если я могу кэшировать или собирать их с течением времени, чтобы получить более полную и непротиворечивую картину того, что находится вмакет приложения.
Я смотрел другие посты о accessibilitynodeinfo, такие как ( Android AccessibilityNodeInfo refresh () и recycle () ), но это по-прежнему не отвечает на вопросы, например, когда узел становитсяневерно или что произойдет, если я не перезапущу узел и попытаюсь использовать его позже (особенно, если элемент был удален приложением).Вопросы, на которые я ищу ответы, относятся к следующему коду:
//for caching nodes... bad idea?
HashMap<String,AccessibilityNodeInfo> cachedNodes = new HashMap<>();
//gets fired for lots of reasons, can contain arbitrary subsets of the total app layout hierarchy (appears upper bounded by what is visible on the screen)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// my accessibility service is listening to all event types
AccessibilityNodeInfo nodeInfo = event.getSource();
//sometimes the node is just totally null... why??
if(nodeInfo != null){
//what is this really doing? Why is this node sometimes different from traversing up the hierarchy with getParent() manually?
rootNode = getRootInActiveWindow();
if(rootNode == null) {
rootNode = nodeInfo;
AccessibilityNodeInfo parent = nodeInfo.getParent();
while(parent != null){
rootNode = parent;
parent = rootNode.getParent();
}
}
//It appears this method returns all matches in the event hierarchy regardless of which node you call it on?
List<AccessibilityNodeInfo> nodesOfInterest = rootNode.findAccessibilityNodeInfosByViewId("package.name/id_of_nodes_i_want");
for(AccessibilityNodeInfo node: nodesOfInterest){
//my accessibility service is set up to be able to get view ids and retrieve window content, but view ids are not unique
// may have to compose an ID based on the view type lineage of the node?
if(!cachedNodes.containsKey(getUniqueID(node)){
cachedNodes.put(getUniqueID(node),node);
}
}
}
}