文章目录
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。