您好,登錄后才能下訂單哦!
上一篇文章《UiAutomator源碼分析之UiAutomatorBridge框架》中我們把UiAutomatorBridge以及它相關(guān)的類進(jìn)行的描述,往下我們會嘗試根據(jù)兩個(gè)實(shí)例將這些類給串聯(lián)起來,我準(zhǔn)備做的是用如下兩個(gè)很有代表性的實(shí)例:
/* */ UiAutomatorBridge(UiAutomation uiAutomation) /* */ { /* 48 */ this.mUiAutomation = uiAutomation; /* 49 */ this.mInteractionController = new InteractionController(this); /* 50 */ this.mQueryController = new QueryController(this); /* */ }
public boolean pressHome() { 218 Tracer.trace(); 219 waitForIdle(); 220 return getAutomatorBridge().getInteractionController().sendKeyAndWaitForEvent( 221 KeyEvent.KEYCODE_HOME, 0, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED, 222 KEY_PRESS_EVENT_TIMEOUT); 223 }
/* */ public boolean sendKeyAndWaitForEvent(final int keyCode, final int metaState, int eventType, long timeout) /* */ { /* 188 */ Runnable command = new Runnable() /* */ { /* */ public void run() { /* 191 */ long eventTime = SystemClock.uptimeMillis(); /* 192 */ KeyEvent downEvent = new KeyEvent(eventTime, eventTime, 0, keyCode, 0, metaState, -1, 0, 0, 257); /* */ /* */ /* 195 */ if (InteractionController.this.injectEventSync(downEvent)) { /* 196 */ KeyEvent upEvent = new KeyEvent(eventTime, eventTime, 1, keyCode, 0, metaState, -1, 0, 0, 257); /* */ /* */ /* 199 */ InteractionController.this.injectEventSync(upEvent); /* */ } /* */ /* */ } /* 203 */ }; /* 204 */ return runAndWaitForEvents(command, new WaitForAnyEventPredicate(eventType), timeout) != null; /* */ }代碼中創(chuàng)建了一個(gè)Runnable的線程,線程里面run重寫方法要做的事情就是去做注入事件的事情,那么為什么我們不直接去調(diào)用事件而需要?jiǎng)?chuàng)建一個(gè)線程了,這是因?yàn)槲覀冊谧⑷胪晔录筮€要去等待我們上面定義的預(yù)期的eventType是否有出現(xiàn)來判斷我們的事件注入究竟是否成功,這個(gè)就是204行runAndWaitForEvents做的事情。但我們這里還是先看下線程中是如何注入事件的:
/* */ private boolean injectEventSync(InputEvent event) { /* 655 */ return this.mUiAutomatorBridge.injectInputEvent(event, true); /* */ }再跟蹤到UiAutomatorBridge對象:
/* */ public boolean injectInputEvent(InputEvent event, boolean sync) { /* 70 */ return this.mUiAutomation.injectInputEvent(event, sync); /* */ }可以看到最終還是通過UiAutomation來注入事件的,和我們的預(yù)期是一致的。
/* */ private AccessibilityEvent runAndWaitForEvents(Runnable command, UiAutomation.AccessibilityEventFilter filter, long timeout) /* */ { /* */ try /* */ { /* 161 */ return this.mUiAutomatorBridge.executeCommandAndWaitForAccessibilityEvent(command, filter, timeout); /* */ } /* */ catch (TimeoutException e) { /* 164 */ Log.w(LOG_TAG, "runAndwaitForEvent timedout waiting for events"); /* 165 */ return null; /* */ } catch (Exception e) { /* 167 */ Log.e(LOG_TAG, "exception from executeCommandAndWaitForAccessibilityEvent", e); } /* 168 */ return null; /* */ }代碼又跳到了UiAutomatorBridge這個(gè)類
/* */ public AccessibilityEvent executeCommandAndWaitForAccessibilityEvent(Runnable command, UiAutomation.AccessibilityEventFilter filter, long timeoutMillis) throws TimeoutException /* */ { /* 104 */ return this.mUiAutomation.executeAndWaitForEvent(command, filter, timeoutMillis); /* */ }最終把要執(zhí)行的runnable執(zhí)行注入事件的線程command和我們預(yù)期事件發(fā)生后返回來的窗口事件filter以及超時(shí)timeoutMillis傳進(jìn)去,UiAutomation就會和AccessibilityService進(jìn)行交互以注入事件并且等待預(yù)期AccessibilityEvent發(fā)生或者超時(shí)返回。至于UiAutomation是如何和AccessibilityService交互的,這就超出了這個(gè)系列文章的范疇了。也許今后有充裕的時(shí)間的話我們再來深入去了解分析它。
作者 | 自主博客 | 微信 | CSDN |
天地會珠海分舵 | http://techgogogo.com | 服務(wù)號:TechGoGoGo 掃描碼:
| 向AI問一下細(xì)節(jié) 免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。 猜你喜歡最新資訊相關(guān)推薦相關(guān)標(biāo)簽AI
助 手 |