Robotium通过广播与服务+shell命令实现跨进程自动化测试之广播与服务
还记得当初刚学robotium的时候,有人提起过这个方法,当时觉得很牛逼,暂时不想接触(其实就是对比较深入,难以快速理解的知识的畏惧)。现在到了不得不去了解的时候,也只能硬着头皮上了。。。
先来讲一下我现在对这个方法的理解:整个Android程序,我们可以看成是一个个的实验室(进程)组成的,我们使用robotium就转属于其中一个实验室,实验室的规定非常的严格,不允许人员进入其他的实验室。但是人总是要有些消息或者有些活动需要别的实验室配合(跨进程)。。这个时候我们只有一种办法,就是通过中转人员(服务)告知其他的实验室我们需要他们配合,并把具体的流程告知他们,其他实验室(adb)完成了我们需要他们配合的操作后,中转人员再回来告知我们,我们就可以开始接下来的工作了。。差不多就是这个原理。。
粗略来看,整个流程有几个重点:1.服务怎么来的。2.服务是如何接收到你的请求的。
在我们的实验室中,方便点,按个铃就有中转人员过来找你,然后把你想要告知的信息,以及告诉哪个实验室记录下来。。很方便。
在Android的世界,方式有点不一样。
服务的启动,在网上找到的方法有两种,一种是在用例的setup中启动,一种是开机就启动的服务。这里我们选择第一种,第二种没有实验过,所以不敢妄言可不可以成功。
当然,我们的文章是探究广播与服务之间的联系,在接下来的几篇博文中,我会慢慢把我了解都告诉大家,慢慢剥下Robotium跨进程的面纱。
所以我先使用一种简单的方法把关于广播和服务的东西告诉大家,同时也给自己做一个整理和记录。
先说下原理:Android程序中,我们首先需要一个服务,上面说了,我们选择在setup中启动我们的服务。其次,发送广播后需要有一个接收器去将广播接收过来,接收器接收到广播后会执行onReceive中的代码。理一下思路:发送广播(如何发?),接收器将广播接收过来(怎么接收?),onReceive中的代码又该做什么?这篇文章仅介绍前两个。
OK,稍微理了一下,可能有说的不对的,不过大致差不多了。那我们先看下第一步:如何发送广播?
根据我们的指导思想,首先启动服务,有了服务我们才有接下去实现其他东西的可能。我这里并不是在测试代码中添加的,而是在一个Click事件中添加的,也就是点击按钮启动服务,原理其实一样。Intent第一个参数是当前Activity,第二个是你要启动的东西,可以是另一个Activity也可以是一个服务。startService(intent)就启动了这个服务了。对Intent概念不熟悉的朋友建议去看下Android基础,很急很关键好吧!
1 Intent intent = new Intent(myActivity.this, MyService.class); 2 startService(intent);
在网络通信中,我们知道,大家都要遵守一个协议才可以互相通信,不遵守协议,网络就不让你玩儿!在Android中的广播和接收器也是一样的,接收器只有验证了密码才会接收这条广播。我们接收器和广播之间通信的密码也是使用Intent设置的,先上两行代码:
1 Intent intent = new Intent(); 2 intent.setAction("android.qwerty.action.open"); 3 sendBroadcast(intent);
接下来,可以看到,我们实例化了一个Intent,然后第二段代码的作用就是设置我们通信的密码了,只有接收器的密码也是"android.qwerty.action.open",接收器才会接收这段广播,第三段代码就是发送广播的代码了。这样我们就可以在
很简单吧!但是我在网上找了很多资料才慢慢了解,请原谅我这个Android菜鸟吧!现在发送广播的代码有了,我们就需要设计接收器了。相对发送广播的代码,接收器的实现稍微复杂一点,但是并不难,相信我。上代码。。。
1 @Override 2 public void onCreate(){ 3 br = new BootReceiver(); 4 IntentFilter myIF = new IntentFilter(); 5 myIF.addAction("android.qwerty.action.open"); 6 registerReceiver(br, myIF); 7 super.onCreate(); 8 }
@Override public void onDestroy(){ unregisterReceiver(br); br = null; super.onDestroy(); }
接收器需要注册,请原谅我没有把private BootReceiver br这段代码拷进来,就把它当做一个美丽的错误吧。。。注册接收器首先我们要有接收器的实例也就是我们的第一段代码的第三句,然后上面说了,接收器和广播需要有同样的密码,第四,第五句就是设置接收器的接收密码,然后注册接收器。第二段代码是将接收器注销。
一切看起来都那么的美好对吧,我们需要广播,三段代码就有了,我们需要接收器也很快就注册好了。接下来我们要开始写onReceive的代码了,我们的接收器接收到广播后,程序会自动开始onReceive内的代码,切记。
public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //加上我们需要实现的逻辑即可 } }
OK,接收器的代码也全部贴上,我们只需要新建一个Service,在Service中注册我们的接收器,然后在setup代码中启动我们的Service,在执行到例如拍照,查看图库等动作时,发一个广播出来,Service接收到了这个广播后,开始执行onReceive中的代码,如点击拍照按钮,当然这一步就需要我们使用shell命令了。如果有兴趣了解shell的,可以点击这里查看xuxu的文章,非常感谢分享。
好了,到这里如何建立广播与服务的联系也介绍的差不多了,说的可能不是很好,如果有疑问请联系QQ:727665171,欢迎大家骚扰。
文章为本人原创,里面有很多说的不明白还有不正确的地方,但是创作不易,转载请务必声明,非常感谢。