这篇文章主要介绍“Android无障碍服务performAction怎么调用”,在日常操作中,相信很多人在Android无障碍服务performAction怎么调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android无障碍服务performAction怎么调用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!无障碍服务可以模拟一些用户操作,无障碍可以处理的对象,通过类 AccessibilityNodeInfo 表示,通过无障碍服务,可以通过它的performAction
方法来触发一些 action ,包括:他们都可以通过performAction
方法进行处理:在这个方法中,第一步是检查 perform 是否可以通过 connection 请求,这里 connection 检查是根据通过 binder 通信传递过来的 id 检查连接是否正常。 然后通过AccessibilityInteractionClient
对象,调用它的performAccessibilityAction
方法去进行实际操作的。这个类是一个执行可访问性交互的单例,它可以根据 View 的快照查询远程的 View 层次结构,以及通过 View 层次结构,来请求对 View 执行某项操作。基本原理:内容检索 API 从客户端的角度来看是同步的,但在内部它们是异步的。客户端线程调用系统请求操作并提供回调以接收结果,然后等待该结果的超时。系统强制执行安全性并将请求委托给给定的视图层次结构, 在该视图层次结构中发布消息(来自 Binder 线程),描述 UI 线程要执行的内容,其结果是通过上述回调传递的。但是,被阻塞的客户端线程和目标视图层次结构的主 UI 线程可以是同一个线程,例如无障碍服务和 Activity 在同一个进程中运行,因此它们在同一个主线程上执行。 在这种情况下,检索将会失败,因为 UI 线程在等待检索结果,会导致阻塞。 为了避免在进行调用时出现这种情况,客户端还会传递其进程和线程 ID,以便访问的视图层次结构可以检测发出请求的客户端是否正在其主 UI 线程中运行。 在这种情况下,视图层次结构,特别是对它执行 IPC 的绑定线程,不会发布要在 UI 线程上运行的消息,而是将其传递给单例交互客户端,通过该客户端发生所有交互,后者负责执行开始等待通过回调传递的异步结果之前的消息。在这种情况下,已经收到预期的结果,因此不执行等待。上面是官方备注的描述,大概意思最好不要在主线程执行检索操作。继续跟进它的performAccessibilityAction
方法:这里通过getConnection(connectionId)
获取了一个IAccessibilityServiceConnection
。这里的 sConnectionCache 通过 AccessibilityInteractionClient 的addConnection
添加数据的,addConnection
在 AccessbilityService 创建初始化时调用的:也就是说,在 AccessbilityService 创建时,会将一个表示连接的对象存到 AccessibilityInteractionClient 的连接缓存中。它是 AccessibilityManagerService 向 AccessbilityService 暴露的 AIDL 接口,提供给 AccessbilityService 调用AccessibilityManagerService 的能力。 上面的 performAction 流程中,调用到了 connection 的performAccessibilityAction
方法。 而 IAccessibilityServiceConnection 有两个实现类,AccessibilityServiceConnectionImpl
和AbstractAccessibilityServiceConnection
,前者都是空实现,显然不是我们要调用到的地方,后者的performAccessibilityAction
:最后的一行调用:在这个方法中,通过 connection 调用到了远端的performAccessibilityAction
方法。关键的一行是:这里的 connection 类型定义成了RemoteAccessibilityConnection
。RemoteAccessibilityConnection 是AccessibilityWindowManager
的内部类,它的getRemote()
返回类型是IAccessibilityInteractionConnection
。此类为 AccessibilityManagerService 提供 API 来管理 AccessibilityWindowInfo 和 WindowInfos。这是一个 AIDL 中定义的接口,用来进行 给定 window 中 AccessibilityManagerService 和 ViewRoot 之间交互的接口。也就是说getRemote(). performAccessibilityAction(...)
最终来到了 ViewRootImpl 中。ViewRootImpl 中存在一个内部类AccessibilityInteractionConnection
,它是这个 ViewAncestor 提供给 AccessibilityManagerService 的一个接口,后者可以与这个 ViewAncestor 中的视图层次结构进行交互。它的performAccessibilityAction
实现是:内部又是通过代理调用 ,ViewRootImpl 的getAccessibilityInteractionController()
返回了一个AccessibilityInteractionController
对象。它的performAccessibilityActionClientThread
:组装了一个 message ,并通过scheduleMessage
方法去执行:这里实际上,如果是在主线程,则处理消息,如果不是,则发送消息到主线程处理。handler 的类型是PrivateHandler
,在 AccessibilityInteractionController 内部定义。它的处理消息方法的实现是:执行到了performAccessibilityActionUiThread(message);
:在这个流程中,分为三种情况去真正执行 performAction :1. action == R.id.accessibilityActionClic免费云主机域名kOnClickableSpan2. View. AccessibilityNodeProvider != null当能够通过 View 获取到 AccessibilityNodeProvider 对象是,通过它的 performAction 方法,去执行真正的调用,它的真正调用在AccessibilityNodeProviderCompat
中,这个 Compat 的实现在ExploreByTouchHelper
中的内部类MyNodeProvider
中:在 ExploreByTouchHelper 中继续查看:前者调用到了 ViewCompat :然后是 View 的 :mAccessibilityDelegate.performAccessibilityAction
的实现是:也是调用到了 View 的performAccessibilityActionInternal
。performAccessibilityActionInternal
的实现是:以AccessibilityNodeInfo.ACTION_CLICK
为例,内部调用是:这样就调用到了 View 的点击事件。3. View. AccessibilityNodeProvider == null && virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID这里 target 是个 View, 也是走的 View 的 performAccessibilityAction ,和上面流程一样。同步的。到此,关于“Android无障碍服务performAction怎么调用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
本篇内容介绍了“react如何删除eslint”的有关知识,在实际案例的操作过程中,不少人都会免费云主机域名遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! react删除eslint的方法:1、执行“npm …
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。