最新的Robotium5.2.1官方新增了一个unlockScreen的API,详情介绍见:
5.2.1
。
官方说明这个API可以自动打开锁定的屏幕,这是很实用的功能,如果模拟器或者真机锁屏了,不解锁的话会运行不了测试用例,当前我们为了防止锁屏会安装一个软件保持屏幕常亮,但是会比较耗电。
这个API怎么使用呢?
很简单,只需要在用例开始执行之前调用一下这个API即可,如下代码所示。
public void testAddNote() {
solo.unlockScreen();
solo.clickOnMenuItem("Add note");
}
在模拟器中尝试可以自动解锁,真机中还没尝试,尝过过后补充一下。
底层是怎么实现的呢?
有了这个API,那我们来看一下它底层是怎么实现的,下面是Robotium的源代码
通过源代码可以发现底层实现也很简单,只有一句代码,关键的是 FLAG_DISMISS_KEYGUARD这个参数的设置。
可以参考Android的官网对于这个 参数的介绍 。
官网的介绍中也有说明这个自动解锁只针对不是安全的锁,如果是需要密码的这种安全锁还是解锁不了的,从安全性角度来看,这也是正常的,如果这样也能解锁那就能够破解密码,个人隐私也容易泄露。
官方说明这个API可以自动打开锁定的屏幕,这是很实用的功能,如果模拟器或者真机锁屏了,不解锁的话会运行不了测试用例,当前我们为了防止锁屏会安装一个软件保持屏幕常亮,但是会比较耗电。
这个API怎么使用呢?
很简单,只需要在用例开始执行之前调用一下这个API即可,如下代码所示。
public void testAddNote() {
solo.unlockScreen();
solo.clickOnMenuItem("Add note");
}
在模拟器中尝试可以自动解锁,真机中还没尝试,尝过过后补充一下。
底层是怎么实现的呢?
有了这个API,那我们来看一下它底层是怎么实现的,下面是Robotium的源代码
/*** Unlocks the lock screen.*/public void unlockScreen (){instrumentation . runOnMainSync ( new Runnable () {@Overridepublic void run () {activityUtils . getCurrentActivity ( false ). getWindow (). addFlags ( WindowManager . LayoutParams . FLAG_DISMISS_KEYGUARD );}});}});}
通过源代码可以发现底层实现也很简单,只有一句代码,关键的是 FLAG_DISMISS_KEYGUARD这个参数的设置。
可以参考Android的官网对于这个 参数的介绍 。
官网的介绍中也有说明这个自动解锁只针对不是安全的锁,如果是需要密码的这种安全锁还是解锁不了的,从安全性角度来看,这也是正常的,如果这样也能解锁那就能够破解密码,个人隐私也容易泄露。
FLAG_SHOW_WHEN_LOCKED参数介绍
关于这个参数,官方介也有详细介绍,可以实现当前界面优先于锁屏界面,就是可以在锁屏界面的上层显示,不过这个实现的不是解锁操作,这个功能可能针对一些闹铃应用等需要在锁屏界面显示的比较有用。不过我们的UI自动化测试也可以尝试一下增加这个参数针对加密的锁屏设备是否可行。