Monkey源码分析之事件注入
本系列的上一篇文章《Monkey源码分析之事件源》中我们描述了monkey是怎么从事件源取得命令,然后将命令转换成事件放到事件队列里面的,但是到现在位置我们还没有了解monkey里面的事件是怎么一回事,本篇文章就以这个问题作为切入点,尝试去搞清楚monkey的event架构是怎么样的,然后为什么是这样架构的,以及它又是怎么注入事件来触发点击等动作的。
成都创新互联是一家专业从事成都做网站、成都网站制作的网络公司。作为专业网站设计公司,成都创新互联依托的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、成都营销网站建设及网站设计开发服务!
在看这篇文章之前,希望大家最好先去看下另外几篇博文,这样理解起来就会更容易更清晰了:
- 《Monkey源码分析番外篇之Android注入事件的三种方法比较》
- 《Monkey源码分析番外篇之WindowManager注入事件如何跳出进程间安全限制》
- 《Android下WindowManager的作用》
1. 事件架构
这里我们先从上一篇文章《Monkey源码分析之事件源》中来自网上的monkey架构图中截取MonkeyEvent相关的部分来看下MonkeyEvent的架构是怎么样的。
那么我们对号入座,看下MonkeyEvent得设计是否满足该command模式的要求:
- Command:MonkeyEvent,声明了injectEvent这个execute接口方法
- ConcreteCommand: 各个MonkeyEvent实现类:MonkeyKeyEvent,MonkeyTouchEvent,MonkeyWaitEvent...
- Client: Monkey,记得它在runMonkeyCyles方法中调用了mEventSource.getNextEvent()方法来从事件源获取事件,并根据各个事件源的translateCommand方法来创建对应事件(ConcretCommand)吧?不记得的话请先看《Monkey源码分析之运行流程》和《Monkey源码分析之事件源》
- Receiver: WindowManager等的实例对象,因为是它们最终实施和执行了injectXXXEvent这些请求。
- Invoker: Monkey,因为直接调用MonkeyKevent(command)的injectEvent(execute)这个方法的地方依然是在Monkey的runMonkeyCeles这个方法中:ev.injectEvent(mWm,mAm,mVerbose)。所以Monkey在这里既扮演饿Command角色,又扮演了Invoker这个角色。
从中可以看到 MonkeyEvent的设计确实是满足了Command模式的,那么这样设计有什么好处呢?大家不知道的最好自己去google,这里我自己不精通设计模式,所以我只能实际情况实际分析,看下网上描述的这个设计模式的优点在我们的monkey中是否有获得:
- (1)命令模式使新的命令很容易地被加入到系统里:诚然!如果增加个实现处理吹下屏幕的事件(Command)的话我们只需要增加个类MonkeyBlowEvent,并实现injectEvent接口,然后在里面调用相应的Receiver来注入Blow这个事件就行了
- (2)允许接收请求的一方决定是否要否决请求:这点本人没有领悟好处是什么,谁清楚的请comment
- (3)能较容易地设计一个命令队列:确实!monkey中就是把所有的事件抽象成MonkeyEvent然后放到我们的EventQueque里面的
- (4)可以容易地实现对请求的撤销和恢复:这里没有用到,因为一个event消费掉后是不能撤销的。你总不能说你现在点击了个按钮后悔了,程序会点击后先不执行等待你发送个undo命令吧。不过如果用在文档编辑的undo功能中应该是挺不错的
- (5)在需要的情况下,可以较容易地将命令记入日志:也是,每个ConcreteCommand类都是独立的,所以想把命令记录下来是很简单的事情该是我MonkeyKeyEvent的命令总不会变成是你MonkeyTouchEvent的命令嘛
作者 | 自主博客 | 微信 | CSDN |
天地会珠海分舵 | http://techgogogo.com | 服务号:TechGoGoGo 扫描码: | http://azwzsj.com/article/gsdgeh.html |