Android accessibility小结

1. Accessibility

Accessibility用来帮助残障人士使用Android 设备和App,从实现角度看主要分为两部分:AccessibilityService和AccessibilityManagerService,前者用来实现具体功能,后者属于系统服务用来管理和给前者分发事件。很多Android系统上语音助手的所见即可说就是基于Accessbility实现的,可惜当年我的老板并不认可这种功能,我的demo也就未能落地到产品,现在反思这个结果和我当时的说辞不够有说服力也不无关系。

2. AccessibilityService

AccessibilityService.java中有相关注释,可以帮助理解,另外Android提供了文档Create youre own accessibility service

3. AccessibilityManagerService

AccessibilityManagerService是系统服务,在SystemServer的startOtherServices()方法中启动,只能被system访问。
AccessibilityManagerService在updateServicesLocked(...)方法中会去bind被enable的AccessibilityService,系统为AccessibilityService的管理提供了菜单,相关的Settings item是Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
AccessibilityManagerService成功bind到相应的AccessibilityService后会传递一个IAccessibilityServiceConnection对象给它,后续双方通过IAccessibilityInteractionConnection进行沟通。
AccessibilityService是通过AccessibilityInteractionClient和AccessibilityNodeInfo等辅助类访问IAccessibilityInteractionConnection的。

4. Accessibility和Window以及View之间的关联

AccessibilityManagerService内的AccessibilityWindowManager通过调用WindowManagerService的setWindowsForAccessibilityCallback(...)方法注册callback,然后接收来自WindowManagerService内的与Window相关的AccessibilityEvent,进而将相关event转给AccessibilityManagerService。WindowsManagerSercice内是通过AccessibilityController处理与Accessibility相关的逻辑,AccessibilityController会为相应的display创建WindowsForAccessibilityObserver对象,callback引用也会保存在该对象中,computeChangedWindows(...)方法会触发callback对象的onWindowsForAccessibilityChanged(...)方法, 这里的callback对象为AccessibilityWindowManager的内部类DisplayWindowsObserver。

ViewRootImpl是Accessibility和View关联的桥梁,ViewRootImpl通过IAccessibilityInteractionConnection和AccessibilityManagerService通信,把view hierarchy中的信息传递给AccessibilityManagerService。
AccessibilityManagerServiced通过IAccessibilityInteractionConnection把需要执行的Action等传递给相应的View。
Accessibility


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值