【问题标题】:Prevent onAccessibilityEvent(AccessibilityEvent event) goes in an infinite loop防止 onAccessibilityEvent(AccessibilityEvent event) 进入无限循环
【发布时间】:2015-11-20 10:42:54
【问题描述】:

我有一个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 有什么想法吗?

编辑:我认为问题出在AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED。如果我绕过该检查,它可以工作,但很难控制。

【问题讨论】:

  • 我也在做同样的事情,我的应用程序也崩溃了。你能建议你为纠正这个问题做了什么吗?
  • 崩溃?有日志吗?
  • 它会在一段时间后崩溃。在日志中它显示为“将代码缓存容量增加到 128KB”...“将代码缓存容量增加到 256KB”...“将代码缓存容量增加到 512KB”这样然后它就崩溃了
  • 听起来像是内存泄漏:stackoverflow.com/questions/29193726/…
  • 顺便说一句,使用 findAccessibilityNodeInfosByText(string) 是一个选项 :))

标签: android accessibility accessibilityservice accessibility-api


【解决方案1】:

在您的代码中,只要 AccessibilityService 在设置活动中检测到强制停止按钮,就会单击它。 现在,将显示一个带有两个按钮的对话框:确定和取消。 然后,您正在对取消按钮执行单击操作。

所以,App Info -> Dialog -> Cancel -> App Info -> Dialog -> Cancel ...

是你会得到的循环。

更改list = nodeInfo.findAccessibilityNodeInfosByText("CANCEL");

list = nodeInfo.findAccessibilityNodeInfosByText("OK");

为了点击一个节点,你必须添加一些延迟:

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

【讨论】:

  • 其实这不是我想问的。因为它甚至没有点击“强制停止”。那么我为什么要关心点击“取消”或“确定”呢?
  • 在我现在的代码中,实际上有一些“延迟”的代码。但它非常被动。首先,如果我的手机刚刚完成了一项非常繁重的工作并且我运行了这段代码,那么 300 毫秒似乎还不够。其次,我认为应该延迟的代码是“findnode”,而不是“performAction”。但无论如何,一个赞成票:D
  • 是的,但我确实认为 performAction 的延迟会起作用。无论如何谢谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多