zoukankan      html  css  js  c++  java
  • uiautomator 原理 (UiAutomation、UiAutomatorBridge、QueryController)

    UiAutomation

    UiAutomation主要和AccessibilityService进行连接然后获取界面空间信息和注入事件,截图

    获取界面空间信息:

    public AccessibilityNodeInfo getRootInActiveWindow() {
         return this.mUiAutomation.getRootInActiveWindow();
       }

    注入事件:

    public boolean injectInputEvent(InputEvent event, boolean sync) {
         return this.mUiAutomation.injectInputEvent(event, sync);
      }

    截图:

    Bitmap screenshot = this.mUiAutomation.takeScreenshot();

    UiAutomatorBridge

    UiAutomatorBridge相当于UiAutomation的代理,进行获取界面空间信息和注入事件,截图都需要经过UiAutomatorBridge

    private boolean injectEventSync(InputEvent event) {
        return this.mUiAutomatorBridge.injectInputEvent(event, true);
      }
    this.mUiAutomatorBridge.getRootInActiveWindow(); 

    QueryController

    QueryController做的所有事情就是去把UiSelector这个UI控件选择子翻译成真实的适合我们使用的Android.view.accessibility.AccessibilityNodeInfo

    protected AccessibilityNodeInfo findAccessibilityNodeInfo(long timeout)
      {
        AccessibilityNodeInfo node = null;
      long startMills = SystemClock.uptimeMillis();
       long currentMills = 0L;
       while (currentMills <= timeout) {
         node = getQueryController().findAccessibilityNodeInfo(getSelector());
         if (node != null) {
            break;
         }
        
         UiDevice.getInstance().runWatchers();
         
         currentMills = SystemClock.uptimeMillis() - startMills;
          if (timeout > 0L) {
            SystemClock.sleep(1000L);
         }
       }
        return node;
    }

    UiDevice的实例化

    private UiDevice(Instrumentation instrumentation) {
        this.mInstrumentation = instrumentation;
        UiAutomation uiAutomation = instrumentation.getUiAutomation();
        this.mUiAutomationBridge = new InstrumentationUiAutomatorBridge(instrumentation.getContext(), uiAutomation);
  • 相关阅读:
    Tomcat 7 的七大新特性 悟寰轩
    MapReduce提交作业常见问题 悟寰轩
    [MQ]关于ActiveMQ的配置 悟寰轩
    LinkedBlockingQueue应用实例 悟寰轩
    什么是java序列化,如何实现java序列化? 悟寰轩
    远程注入DLL的例子
    回调函数实例
    将网页保存为Stream
    删除文件或文件夹
    选择目录
  • 原文地址:https://www.cnblogs.com/season-xie/p/6337687.html
Copyright © 2011-2022 走看看