什么是AccessibilityService?
在开始之前我们先了解一下 AccessibilityService是一个什么东西;AccessibilityService 是一种提供用户界面增强功能的应用程序,可以帮助残障用户或者暂时无法与设备进行完全交互的用户提供界面反馈,帮助用户更好的处理和响应事件。通俗一点来说就是可以帮助我们监听页面的变化,比如按钮的点击,页面的切换,页面内容的变化,通知的接收等,然后我们接收到这些事件之后可以进行我们想做的操作;并且接收到事件之后我们可以获取到事件触发的 View 以及其子 View 的一些信息和当前窗口根节点 View 及其子 View 的一些信息。
Android 从 1.6 就已经引入了 AccessibilityService ,并且在 Android 4.0 对其进行了改进,而在 Android 8.0 开始已经可以执行手势操作了。 所以对我们现在开发 AccessibilityService 已经是非常方便了,我们可以根据用户的操作来进行对应的反馈,并且我们可以自定义一个脚本流程,当用户触发时,我们就可以进行一系列操作,比如自动打开某个App的页面等;微信自动抢红包功能就是基于 AccessibilityService 来实现的。
创建我们的AccessibilityService
1.我们首先要创建一个Service继承自AccessibilityService
2.在 AndroidManifest.xml 中配置我们的 Service (需要指定一些特别属性来表明这是一个 AccessibilityService )
3.在 xml 中配置我们的 AccessibilityService 所监听的 App 包名、接收的事件类型等
我们来一一实现这些步骤,第一步很简单,直接创建一个类继承即可:
class MyAccessibilityService : AccessibilityService() {
override fun onInterrupt() {
}
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
}
override fun onServiceConnected() {
super.onServiceConnected()
}
}
我们实现了三个方法,onServiceConnected() 为服务可用时调用的方法,我们在 xml 里面的配置也可以写到这里;onInterrupt() 为 连接断开时调用的方法;onAccessibilityEvent(event: AccessibilityEvent?) 为接收到监听事件的方法,我们主要的处理逻辑也会写在这里面。
和普通的 Service 一样,这个也需要在 AndroidManifest.xml 中进行声明配置,我们需要添加<intent-filter> 来表示为 AccessibilityService,从 Android 4.0 开始,我们可以添加 <meta-data> 来指定对应的 xml 配置文件,在 xml 里面做一些我们这个 AccessibilityService 的配置。从 4.1 开始,我们还必添加 BIND_ACCESSIBILITY_SERVICE 权限来保护服务,确保只有系统才能够绑定到它。所以 Service 的配置如下:
<service
android:name="com.android.service.MyAccessibilityService"
android:enabled="true"
android:exported="true"
android:label="服务名字"
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/accessibility_service_config" />
</service>
这里面 <meta-data> 所指定的 resource 则为 我们的配置文件名字,这个配置也是可以通过 setServiceInfo(AccessibilityServiceInfo info) 在代码中配置的,我们这里只在xml中进行配置举例来说明,accessibility_service_config.xml代码如下:
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged|typeViewScrolled|typeViewClicked|typeViewFocused"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews|flagRetrieveInteractiveWindows|flagR