安卓无障碍服务(Accessibility Service)原本是为视障、听障等残障人士设计的辅助功能,但它强大的 界面感知能力 让它成为自动化操作、辅助工具开发的重要技术。本文将从零开始介绍无障碍服务的核心概念与工程配置。
一、什么是无障碍服务
无障碍服务是 Android 系统提供的一种特殊后台服务,能够接收系统派发的 AccessibilityEvent,并通过 AccessibilityNodeInfo 访问当前界面的控件树。它可以在不 root 的情况下,读取屏幕内容、监听界面变化、模拟用户点击与手势。
核心能力:监听事件 + 读取节点树 + 模拟操作,三者组合即可实现「看得见、摸得着」的自动化。
典型应用场景
- 辅助工具:屏幕朗读、按键映射、悬浮窗控制
- 自动化:自动签到、自动抢红包、批量点击
- 设备管理:应用防卸载、使用时长统计、行为监控
- 测试辅助:UI 自动化遍历、埋点校验
二、工程配置
无障碍服务的接入需要三步:声明权限 → 注册服务 → 编写配置。
1. AndroidManifest.xml 声明
<!-- 无障碍服务必须在 manifest 中声明 -->
<service
android:name=".service.MyAccessibilityService"
android:label="@string/accessibility_label"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="false">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_config" />
</service>
关键点:
BIND_ACCESSIBILITY_SERVICE权限是系统级绑定,保证只有系统才能连接服务。intent-filter的 action 固定,系统据此识别无障碍服务。meta-data指向服务的配置文件。
2. 创建配置文件 res/xml/accessibility_config.xml
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_desc"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagRequestFilterKeyEvents"
android:canRetrieveWindowContent="true"
android:canPerformGestures="true"
android:notificationTimeout="100" />
常用属性说明:
accessibilityEventTypes:监听的事件类型,typeAllMask表示全部。canRetrieveWindowContent:是否允许读取窗口内容(节点树),必须为 true。canPerformGestures:是否允许执行手势,模拟点击必备。flagRetrieveInteractiveWindows:允许获取多窗口(如悬浮窗、通知栏)。
3. 继承 AccessibilityService
class MyAccessibilityService : AccessibilityService() {
override fun onServiceConnected() {
super.onServiceConnected()
// 服务连接成功,可做初始化
}
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
// 接收系统派发的事件
event ?: return
Log.d("A11y", "事件类型: ${event.eventType}")
}
override fun onInterrupt() {
// 服务被中断时回调
}
}
三、服务生命周期
- 用户开启:服务必须由用户在「设置 → 无障碍」中手动开启,应用无法直接拉起。
- onServiceConnected():服务连接成功,可在此注册全局悬浮窗、初始化缓存。
- onAccessibilityEvent():系统派发事件,服务的核心回调。
- onUnbind():用户关闭服务时回调,用于释放资源。
注意:无障碍服务常驻后台,被系统杀死后会自动重启。但 Android 9+ 后台限制趋严,需配合前台服务或保活策略。
四、引导用户开启服务
由于系统限制,应用无法直接开启无障碍服务,只能跳转到设置页引导用户操作:
fun openAccessibilitySettings(context: Context) {
val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
检测服务是否已开启:
fun isServiceEnabled(context: Context): Boolean {
val service = context.packageName + "/" + MyAccessibilityService::class.java.name
val enabled = Settings.Secure.getString(
context.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
) ?: return false
return enabled.contains(service)
}
小结
本文介绍了无障碍服务的基础概念与工程接入方式。掌握 事件监听 与 节点树查找 后,就能开始构建实际的自动化逻辑,这些内容将在后续文章中展开。