Android 阻止onAccessibilityEvent(AccessibilityEvent事件)进入无限循环
我有一个Android 阻止onAccessibilityEvent(AccessibilityEvent事件)进入无限循环,android,accessibility,accessibilityservice,accessibility-api,Android,Accessibility,Accessibilityservice,Accessibility Api,我有一个AccessibilityEvent可以自动停止应用程序。但当启动应用程序信息意图时,它会进入打开/关闭警报对话框的无限循环 我怎样才能预防它?代码如下: @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event .getEventType()) {
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);
}
}
}
@覆盖
AccessibilityEvent上的公共无效(AccessibilityEvent事件){
如果(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED)=事件
.getEventType()){
AccessibilityNodeInfo nodeInfo=event.getSource();
如果(nodeInfo==null){
返回;
}
列表=节点信息
.findAccessibilityNodeInfosByViewId(“com.android.settings:id/force_stop_按钮”);
用于(AccessibilityNodeInfo节点:列表){
Log.i(标记“check1=“+check”);
节点性能(AccessibilityNodeInfo.ACTION\u单击);
检查=正确;
}
列表=节点信息
.findAccessibilityNodeInfosByText(“取消”);
用于(AccessibilityNodeInfo节点:列表){
节点性能(AccessibilityNodeInfo.ACTION\u单击);
}
}
}
顺便问一下,在应用程序信息意图启动后立即点击强制停止按钮
编辑:我认为问题出在
可访问性事件中。键入\u WINDOW\u STATE\u CHANGED
。如果我绕过该检查,它会工作,但确实很难控制。在您的代码中,每当AccessibilityService在“设置”活动中检测到强制停止按钮时,就会单击该按钮。
现在,将显示一个带有两个按钮的对话框:确定和取消。
然后在“取消”按钮上执行单击操作
所以,应用程序信息->对话框->取消->应用程序信息->对话框->取消
这就是你将得到的循环
更改list=nodeInfo.findAccessibilityNodeInfosByText(“取消”)代码>
tolist=nodeInfo.findAccessibilityNodeInfosByText(“确定”)代码>
要单击节点,必须添加一些延迟:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}, 300);
事实上这不是我想问的。因为它甚至没有点击“强制停止”。那么我为什么要关心单击“取消”或“确定”?在我现在的代码中,实际上有一些“延迟”代码。但它非常被动。首先,如果我的手机刚刚完成了一项非常繁重的工作,并且我运行了这段代码,300毫秒似乎是不够的。其次,我认为应该延迟的代码是“findnode”,而不是“performation”代码。但无论如何,一票赞成:迪亚,但我确实认为推迟表演会奏效。无论如何,谢谢你;)我也在做同样的事情,我的应用程序也崩溃了。你能建议你做了什么来纠正这个问题吗?崩溃?有日志吗?过了一会儿就崩溃了。在日志中,它是“将代码缓存容量增加到128KB”将代码缓存容量增加到256KB“…”像这样将代码缓存容量增加到512KB,然后崩溃听起来像内存泄漏:顺便说一句,使用findAccessibilityNodeInfosByText(字符串)是一个选项:))