Каков жизненный цикл AccessibilityNodeInfo? - PullRequest
1 голос
/ 11 июля 2019

Я работаю над приложением 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);
            }
        }
    }

}

1 Ответ

0 голосов
/ 12 июля 2019

AccessibilityNodeInfo or AccessibilityNodeInfoCompat (для совместимости с обратным словом) не являются представлениями.

Когда вы открываете любой экран телефона, его содержимое называется Windows, которое представляется в виде дерева информации об узле доступности.

Иногда вы получаете AccessibilityNodeInfo как ноль, но после обновления вы можете получить значение этого конкретного узла.

accessibilityNodeInfo.refresh();

Обновляет эту информацию с последним состоянием представления, которое оно представляет.

Вы можете посетить эту страницу, чтобы получить дополнительную информацию. Информация об узле доступности

...