前言
最近开发的一款设备使用到了Accessibility
功能,Android 提供了Accessibility功能和服务帮助这些用户更加简单地操作设备。
需要实现AccessibilityService
,AccessibilityService是一个系统服务,它运行在后台,并且能够收到由系统发出的一些事件,比如通知状态、view 的一些相关事件,指纹,touch 等。
界面中产生的任何变化都会由系统通知给 AccessibilityService。大家熟知的抢红包
软件,Talkback
都是使用AccessibilityService 实现的。自动化测试
等等,都是基于 Accessibility。
后面几篇文章,将慢慢揭开Accessibility的神秘的面纱。请大家多多关注。
AccessibilityService 是 Service 吗
简单例子这里面就不讲了,大家可以网上搜索下。
AndroidManifest.xml
配置如下
<service
android:name="XXX.Service"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessible_service_config" />//对AccessibilityService 的配置文件
</service>
</application>
AccessibilityService 写法就是 Service
,android:permission
,intent-filter
都是必要配置。
貌似还是 Service 那一套,但又不仅限于此,后面的内容可以发现它是不一般的 Servcie。
AccessibilityService 如何启动的
虽作为 Servcie,App 本身并没有启动和停止它,完全由系统调度,这是第一个不一样的地方。
在 AOSP 中类似的由系统调度的 App Service 有很多,比如 JobService
、AutoFillService
、NotificationAssistantService
等
下面将将具体解答这两个问题:
- 谁启动和停止 AccessibilityService ?
- 设备重启了,AccessbilityService 也会启动吗,不会被kill吗?
1. 谁启动了 AccessibilityService
安装AccessibilityService 的应用,会出现在设置-无障碍-应用列表中,选择打开,应用中的AccessibilityService 就启动。
代码上,设置应用 会将AccessibilityService 的 ComponentName
信息 存入 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
AccessibilityManagerService
系统服务将监听该 Map 的变化,启动或者关闭相应 ComponentName 的 AccessibilityService。
流程如下:
- 监听
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
- 更新
AccessibilityUserState
- 遍历
mEnableServices
,如果没有bind 则调用bindService
启动它