0

У меня есть AccessibilityEvent, который может автоматически остановить приложение. Но при запуске приложения инфо-намерения он переходит в бесконечный цикл включения/выключения предупреждения.Предотвращение onAccessibilityEvent (событие AccessibilityEvent) идет в бесконечном цикле

Как я могу предотвратить это? Вот код:

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event 
      .getEventType()) { 
     AccessibilityNodeInfo nodeInfo = event.getSource(); 
     if (nodeInfo == null) { 
      return; 
     } 

      List<AccessibilityNodeInfo> list = nodeInfo 
        .findAccessibilityNodeInfosByViewId("com.android.settings:id/force_stop_button"); 
       for (AccessibilityNodeInfo node : list) { 
        Log.i(TAG, "check1 = " + check); 
        node.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
        check = true; 
       } 

       list = nodeInfo 
         .findAccessibilityNodeInfosByText("CANCEL"); 
       for (AccessibilityNodeInfo node : list) { 
        node.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
       } 
       } 
      } 

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

EDIT: Я думаю, проблема в AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED. Если я обойду эту проверку, она работает, но очень трудно контролировать.

ответ

2

В вашем коде всякий раз, когда AccessibilityService обнаруживает кнопку принудительного останова в действии настроек, она нажимается. Теперь откроется диалоговое окно с двумя кнопками: Ok & Отмена. Затем вы выполняете действие нажатия на кнопку отмены.

Так, App Info -> Диалог -> Отмена -> App Info -> Диалог -> Отмена ...

это цикл вы получите.

list = nodeInfo.findAccessibilityNodeInfosByText("CANCEL"); Изменить

в list = nodeInfo.findAccessibilityNodeInfosByText("OK");

Для того, чтобы щелкнуть узел, вы должны добавить некоторую задержку:

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     node.performAction(AccessibilityNodeInfo.ACTION_CLICK); 
    } 
}, 300); 
+0

На самом деле это не то, что я хочу спросить. Потому что он даже не щелкнет «Force Stop». Так почему я должен заботиться о нажатии «Отмена» или «ОК»? –

+0

Попробуйте отредактировать, что я сделал. –

+0

В моем коде сейчас на самом деле есть несколько «отложенных» кодов. Но это очень пассивно. Во-первых, если мой телефон просто занимался действительно тяжелой работой, и я запускаю этот код, 300 мс кажется недостаточным. Во-вторых, я думаю, что код должен быть задержан, это «findnode», а не «performAction». Но так или иначе, один взнос: D –