Evil Mouth's Blog

Android AccessibilityService - 链式结构

August 27, 2018

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

0x00 AccessibilityService

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

@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概念,将每种变化通过链式结构连接起来,只需要关心 当前变化的判定当前变化的处理下一步变化的预判

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

— Evil Mouth