在第2节中我们看到了MonkeySourceNetwork是怎样从Socket中获取MonkeyRunner发送过来的命令字串的,可是最后怎样将它翻译成事件的代码我们还没有进行分析,由于在那之前我们还没有了解命令翻译类的相关知识。那么经过第3小节对命令翻译类的学习后,我们就能够继续往下分析MonkeySourceNetwork的getNextEvent中是怎样翻译命令字串的了。

我们回看下第2小节,最后在获得命令字串之后调用的是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 }

代码6-4-1 MonkeySourceNetwork - translateCommand

  • 653行: 传进来的參数就是一个命令字串。

    通过” 表3-3-1 命令字串和相应的命令翻译类參照表”我们能够看到一个命令字串假设带有參数的话它的形式可能是这种“type line”

  • 656行: 为了方便使用该命令。通过调用commandLineSplit方法把命令字串转换成一个列表分别把命令。每一个參数都独立保存在列表里面。

    这种方法无非就是依据空格等把命令和參数分解出来。所以就不跟踪进去分析了

  • 658行: 将命令和參数分离分别存放到列表后,依据命令去” 代码3-1-2 MonkeySourceNetwork - COMMAND_MAP”所描写叙述的COMMAND_MAP去查找相应的命令翻译类实例。以上面的”touch x y”命令字串为例,就是依据”type”去COMMAND_MAP中查找,相应的将是这一行:
461         COMMAND_MAP.put("type", new TypeCommand());

也就是说找到的相应的命令翻译类是TypeCommand

  • 660行:调用命令翻译类的translateCommand方法来翻译命令列表,注意这里传进去的參数除了命令字串列表之外另一个MonkeySourceNetwork的成员变量commandQueue,也就是我们一直说的命令队列,传进去的目的就是在解析命令的过程中假设须要创建一个相应事件实例的话,那么创建完后就直接往这个同一个的命令队列里面丢即可了

那么往下我们就看下上面的TypeCommand的translateCommand方法是怎样实现的:

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 for
302 // 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 }

代码6-4-2 TypeCommand - translateCommand

  • 299-299行: 在命令字串列表中取得type命令的參数line,也就是一大串须要输入的字符串了。然后把该字符串每一个字符拆散开来建立一个字符数组chars,由于以下获得每一个字符相应的系统按键事件KeyEvent的的方法接受的參数就是字符数组
  • 304-305行: KeyCharacterMap的getEvents方法官方的解析是用来依据提供的字符数据流生成一个相应按键事件数组,所以这里的意义就是为输入字串的每一个字符都产生一个按键事件,然后组织成一个按键事件队列返回给events变量。

    这里须要提下的是KeyEvent在Android系统中代表一个按键事件,它内部拥有的每一个按键相应的值以及按键相应的Action如ACTION_DOWN/ACTION_UP等等的定义

  • 308-309行: 依据按键事件创建一个MonkeyKeyEvent实例,并把该事件放到传进来的命令队列里面等待运行

这一小节结合TypeCommand这个命令翻译类我们看到了MonkeySourceNetwork从网络获得一个字串命令后是怎样通过调用自身的translateCommand方法来解析出里面的命令和參数,然后依据命令来查找COMMAND_MAP来获得相应的命令翻译类实例。最后通过命令翻译类的translateCommand来依据命令字串创建相应的MonkeyEvent的并把它增加到命令队列中。

在下一小节我们就去学习下这个MonkeyEvent和命令队列的相关知识。

注:很多其它文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也很欢迎您直接微信(zhubaitian1)勾搭。

本文由天地会珠海分舵原创。转载请自觉,是否投诉维权看心情。

第6章4节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串的更多相关文章

  1. 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  2. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  3. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用   上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...

  4. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  5. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

  6. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

  7. 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  8. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  9. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

随机推荐

  1. STL使用————SET&MULTISET

    SET函数的基本用法 by hhl 使用set的好处 1. 当增加元素后,集合会自动删重并从小到大排列(时间比快排还快)2. 相当于一棵伸展树(能快速求出后继) 使用基础 #include<se ...

  2. 今日SGU 5.19

    SGU 142 题意:给你一个长度为n的串(由a,b组成),让你找出一个串不是n的子串,长度最下 收获:思维题,思路在代码里 #include<bits/stdc++.h> #define ...

  3. 关于结构体内存对齐方式的总结(#pragma pack()和alignas())

    最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...

  4. CodeForces 321 A - Ciel and Robot

    [题目链接]:click here~~ [题目大意]:一个robot 机器人 .能够依据给定的指令行动,给你四种指令,robot初始位置是(0,0).指令一出.robot会反复行动,推断是否能在无限行 ...

  5. MySpring dataSource从配置文件获取

    大神就不看了.本篇是一个人笔记. 原来的数据库配置文件是写死的. 看代码:Mybatis的配置文件 <bean id="dataSource" class="org ...

  6. SQL Server 为代码减负之存储过程

        存储过程能够用来提高数据库的查询效率.由于它事先被编译过.被储存于内存中,每次执行前.不必被从新编译,所以效率非常高. 存储过程是一组sql增删改查的集合,假设程序中的一个功能涉及到对数据库的 ...

  7. Java 实现策略(Strategy)模式

    策略模式:行为型模式 将同一行为,不同的处理算法分别封装起来.让它们之间能够互相替换 1. 定义一个超类型接口,及 行为方法 2. 定义不同的实现类,实现该行为的 不同的算法 /** * 策略模式:针 ...

  8. 将BT下载对抗到底

    将BT下载对抗到底      随着互联网业务的多元化,各种P2P应用也越来越多,在企业中多数流量都会被类似于BT的下载所占用,BT之所以会危害到局域网,是因为它占用了大量网络带宽.网络管理员可以通过一 ...

  9. 最大子矩阵和 51Nod 1051 模板题

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:3*3的矩阵:   -1 3 -1 2 -1 3 -3 1 2   和最大的子矩阵是:   3 - ...

  10. jQuery对象与js对象转换

    前言 jq方法和js的方法属性是不能互相使用的,所以有时候就需要转一下,下面就介绍下方法. js对象转化为jQuery对象 var box=document.getElementById(" ...