Android AccessibilityService - 链式结构

提供一种链式结构AccessibilityService的方案,相比于正常使用AccessibilityService,有着几大优点:结构清晰、调用链一目了然、方便调试等

0x00 AccessibilityService

最原始的写法,就是在onAccessibilityEvent(AccessibilityEvent)回调中根据eventType处理相应的动作

1
2
3
4
5
6
7
8
9
10
11
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
switch (event.getEventType()) {
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
break;
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
break;
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
break;
}
}

处理界面越来越多的时候这里的逻辑就会越来越复杂,维护和调试的难度大大提升

0x01 引入链式概念

引入了Situation概念,将每种变化通过链式结构连接起来,只需要关心 当前变化的判定当前变化的处理下一步变化的预判

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Situation.java

public interface Situation {
// 定义eventType 支持多种
// 例如
// TYPE_NOTIFICATION_STATE_CHANGED | TYPE_WINDOW_STATE_CHANGED
int eventTypes();

// 判定当前变化是否匹配
boolean match(@NonNull AccessibilityService accessibilityService, @NonNull AccessibilityEvent accessibilityEvent);

// 匹配 -> 执行任务
boolean execute(@NonNull AccessibilityService accessibilityService, @NonNull AccessibilityEvent accessibilityEvent);

// 设定下一步 支持多种
Situation[] nextSituations();
}

继承LinkedAccessibilityService创建辅助服务
实现Situation创建步骤

0x02 例子

简单的微信抢红包例子
https://github.com/izyhang/LinkedAccessibilityService/blob/master/example/src/main/java/com/zyhang/linkedaccessibilityservice/example/AccessibilityServiceExample.kt