在第2節(jié)中我們看到了MonkeySourceNetwork是如何從Socket中獲取MonkeyRunner發(fā)送過來的命令字串的,但是最后如何將它翻譯成事件的代碼我們還沒有進行分析,因為在那之前我們還沒有了解命令翻譯類的相關(guān)知識,
第6章4節(jié)《MonkeyRunner源碼剖析》Monkey原理分析事件源事件源概覽翻譯命令
。那么經(jīng)過第3小節(jié)對命令翻譯類的學習后,我們就可以繼續(xù)往下分析MonkeySourceNetwork的getNextEvent中是如何翻譯命令字串的了。我們回看下第2小節(jié),最后在獲得命令字串之后調(diào)用的是MonkeySourceNetwork類的translateCommand方法:
653 private void translateCommand(String commandLine)654 {655 Log.d(MonkeyStub, translateCommand: + commandLine);656 List<string>parts = commandLineSplit(commandLine);657 if (parts.size() > 0) {658 MonkeyCommand command = (MonkeyCommand)COMMAND_MAP.get(parts.get(0));659 if (command != null) {660 MonkeyCommandReturn ret = command.translateCommand(parts, this.commandQueue);661 handleReturn(ret);662 }663 }664 }</string>代碼6-4-1 MonkeySourceNetwork - translateCommand
653行: 傳進來的參數(shù)就是一個命令字串。 通過” 表3-3-1 命令字串和對應(yīng)的命令翻譯類參照表”我們可以看到一個命令字串如果帶有參數(shù)的話它的形式可能是這樣的“type line”
656行: 為了方便使用該命令,通過調(diào)用commandLineSplit方法把命令字串轉(zhuǎn)換成一個列表分別把命令,每個參數(shù)都獨立保存在列表里面。這個方法無非就是根據(jù)空格等把命令和參數(shù)分解出來,所以就不跟蹤進去分析了
658行: 將命令和參數(shù)分離分別存放到列表后,根據(jù)命令去” 代碼3-1-2 MonkeySourceNetwork - COMMAND_MAP”所描述的COMMAND_MAP去查找對應(yīng)的命令翻譯類實例。以上面的”touch x y”命令字串為例,就是根據(jù)”type”去COMMAND_MAP中查找,對應(yīng)的將是這一行:
461 COMMAND_MAP.put(type, new TypeCommand());
也就是說找到的對應(yīng)的命令翻譯類是TypeCommand
660行:調(diào)用命令翻譯類的translateCommand方法來翻譯命令列表,注意這里傳進去的參數(shù)除了命令字串列表之外還有一個MonkeySourceNetwork的成員變量commandQueue,也就是我們一直說的命令隊列,傳進去的目的就是在解析命令的過程中如果需要創(chuàng)建一個對應(yīng)事件實例的話,那么創(chuàng)建完后就直接往這個同一個的命令隊列里面丟就行了
那么往下我們就看下上面的TypeCommand的translateCommand方法是如何實現(xiàn)的:
294 public MonkeyCommandReturn translateCommand(List<string>command,295 CommandQueue queue) {296 if (command.size() == 2) {297 String str = command.get(1);298 299 char[] chars = str.toString().toCharArray();300 301 // Convert the string to an array of KeyEvent's for302 // the built in keymap.303 KeyCharacterMap keyCharacterMap = KeyCharacterMap.304 load(KeyCharacterMap.VIRTUAL_KEYBOARD);305 KeyEvent[] events = keyCharacterMap.getEvents(chars);306 307 // enqueue all the events we just got.308 for (KeyEvent event : events) {309 queue.enqueueEvent(new MonkeyKeyEvent(event));310 }311 return OK;312 }313 return EARG;314 }</string>代碼6-4-2 TypeCommand - translateCommand
299-299行: 在命令字串列表中取得type命令的參數(shù)line,也就是一大串需要輸入的字符串了,
電腦資料
《第6章4節(jié)《MonkeyRunner源碼剖析》Monkey原理分析事件源事件源概覽翻譯命令》(http://www.szmdbiao.com)。然后把該字符串每個字符拆散開來建立一個字符數(shù)組chars,因為下面獲得每個字符對應(yīng)的系統(tǒng)按鍵事件KeyEvent的的方法接受的參數(shù)就是字符數(shù)組304-305行: KeyCharacterMap的getEvents方法官方的解析是用來根據(jù)提供的字符數(shù)據(jù)流生成一個對應(yīng)按鍵事件數(shù)組,所以這里的意義就是為輸入字串的每一個字符都產(chǎn)生一個按鍵事件,然后組織成一個按鍵事件隊列返回給events變量。這里需要提下的是KeyEvent在Android系統(tǒng)中代表一個按鍵事件,它內(nèi)部擁有的每個按鍵對應(yīng)的值以及按鍵對應(yīng)的Action如ACTION_DOWN/ACTION_UP等等的定義
308-309行: 根據(jù)按鍵事件創(chuàng)建一個MonkeyKeyEvent實例,并把該事件放到傳進來的命令隊列里面等待執(zhí)行
這一小節(jié)結(jié)合TypeCommand這個命令翻譯類我們看到了MonkeySourceNetwork從網(wǎng)絡(luò)獲得一個字串命令后是如何通過調(diào)用自身的translateCommand方法來解析出里面的命令和參數(shù),然后根據(jù)命令來查找COMMAND_MAP來獲得對應(yīng)的命令翻譯類實例,最后通過命令翻譯類的translateCommand來根據(jù)命令字串創(chuàng)建對應(yīng)的MonkeyEvent的并把它加入到命令隊列中。
在下一小節(jié)我們就去學習下這個MonkeyEvent和命令隊列的相關(guān)知識。