AccessibilityService简介(官方文档)
Class Overview(概述)
当可访问性事件被触发时,可访问服务在后台运行并接收系统回调。
这样的事件表示用户界面中的一些状态转换,例如,焦点已经改变,
按钮被单击,等等。这样的服务可以选择性地请求查询活动窗口的
内容的功能。可访问性服务的开发需要扩展这个类并实现它的抽象
方法。
开发人员指南
有关创建可访问性服务的更多信息,请阅读易访问性开发人员指南。
生命周期
可访问性服务(AccessibilityService)的生命周期由系统完全管理,并遵循已建立的服务生命周期。此外,启动或停止可访问性服务是通过在设备设置中启用或禁用该服务而由显式的用户操作触发的。系统绑定到一个服务后,它调用onserviceconnUNK()。这个方法可以被希望执行post绑定设置的客户端覆盖。
Declaration(声明)
可访问性被声明为一个AndroidManifest中的任何其他服务。xml,但它还必须指定android.accessibilityservice处理”。AccessibilityService”意图。未能声明此意图将导致系统忽略可访问性服务。此外,可访问性服务必须请求BIND_ACCESSIBILITY_SERVICE权限,以确保只有系统能够绑定到它。未能声明此意图将导致系统忽略可访问性服务。下面是一个示例声明:
<service android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
. . .
</service>
结构
可访问性服务可以配置为接收特定类型的可访问性事件,只监听特定的包,只在给定的时间段内从每个类型中获取事件,检索窗口内容,指定设置活动等。
有两种配置可访问性服务的方法:
在声明服务时,在清单中提供元数据条目。使用元数据标签的服务声明如下:
<service android:name=".MyAccessibilityService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibilityservice" />
</service>
注意:此方法允许设置所有属性。
有关更多细节,请参阅SERVICE_META_DATA和< accessibility - service >
·调用setServiceInfo(AccessibilityServiceInfo)。
注意,这种方法可以调用任何时间来动态更改服务配置。
注意:此方法只允许设置动态可配置属性:eventtype、feedbackType、flags、notificationTimeout、packageNames更多细节请参考AccessibilityServiceInfo。
检索窗口内容
服务可以在声明中指定它可以检索活动窗口内容,该内容表示为可访问的树。注意声明此功能需要服务通过SERVICE_META_DATA引用的XML资源声明其配置。
为了安全起见,可访问性服务只能检索当前活动窗口的内容。当前活动的窗口被定义为窗口,该窗口被触发以下类型的最后一个事件:TYPE_WINDOW_STATE_CHANGED、TYPE_VIEW_HOVER_ENTER、TYPE_VIEW_HOVER_EXIT,换句话说,显示的最后一个窗口或用户在触摸探测过程中接触到的最后一个窗口。
检索窗口内容的入口点是通过调用AccessibilityEvent.getSource()的最后收到上述类型或前一个事件从相同的窗口(见AccessibilityEvent.getWindowId())。调用此方法将返回可访问的可访问性信息,该信息可用于遍历表示为此类对象树的窗口内容。
· 请注意,可访问性服务可能要求对事件类型的子集发出通知,因此不知道活动窗口已经更改。因此,想要检索窗口内容的可访问性服务应该:
· 在没有通知超时的情况下注册所有事件类型,并通过调用最后一个接收事件的getWindowId()跟踪活动窗口,并在调用检索方法之前将其与getWindowId()进行比较。
· 准备一个关于可访问性信息的检索方法可能会失败,因为活动窗口已经更改,而服务还没有获得可访问性事件。注意,即使采用前面一颗子弹中指定的策略,也有可能失败,因为可访问事件分派是异步的,并且跨越了流程边界。
通知策略
对于每个反馈类型,只通知一个可访问性服务。服务将按注册顺序通知。因此,如果在同一个包中注册了两个服务,那么第一个服务就会成功。但是,为给定的反馈类型注册一个服务作为默认值是可能的。在这种情况下,如果没有其他服务对事件感兴趣,则调用此服务。换句话说,默认服务不与其他服务竞争,而且不管注册顺序如何,都将最后通知。这使得“通用的”可访问性服务能够很好地与大多数应用程序共存,并与针对特定应用程序的“抛光”应用程序共存。
注意:事件通知超时对于避免频繁地向客户机传播事件非常有用,因为这是通过昂贵的进程调用完成的。可以将超时看作是决定事件生成何时稳定的标准。