接下来的章节为应用程序UI的测试提供了一些提示,特别是帮助你在UI线程里处理动作,触屏和按键事件,和锁屏。
UI线程中测试
Activity运行在程序的UI线程里。一旦UI初始化后,例如在Activity的onCreate()方法后,所有与UI的交互都必须运行在UI线程里。当你正常运行程序时,它有权限可以访问这个线程,并且不会出现什么特别的事情。
当你运行测试程序时,这一点发生了变化。在带有instrumentation的类里,你可以触发方法在UI线程里运行。其它的测试用例类不允许这么做。为了一个完整的测试方法都在UI线程里运行,你可以使用@UIThreadTest来声明线程。注意,这将会在UI线程里运行方法里所有的语句。不与UI交互的方法不允许这么做;例如,你不能触发Instrumentation.waitForIdleSync()。
如果让方法中的一部分代码运行在UI线程的话,创建一个匿名的Runnable对象,把代码放到run()方法中,然后把这个对象传递给appActivity.runOnUiThread(),在这里,appActivity就是你要测试的app对象。
例如,下面的代码实例化了一个要测试的Activity,为Spinner请求焦点,然后发送一个按键给它。注意:waitForIdleSync和sendKeys不允许在UI线程里运行:
private MyActivity mActivity; // MyActivity is the class name of the app under test
private Spinner mSpinner;
...
protected void setUp() throws Exception {
super.setUp();
mInstrumentation = getInstrumentation();
mActivity = getActivity(); // get a references to the app under test
/*
* Get a reference to the main widget of the app under test, a Spinner
*/
mSpinner = (Spinner) mActivity.findViewById(com.android.demo.myactivity.R.id.Spinner01);
...
public void aTest() {
/*
* request focus for the Spinner, so that the test can send key events to it
* This request must be run on the UI thread. To do this, use the runOnUiThread method
* and pass it a Runnable that contains a call to requestFocus on the Spinner.
*/
mActivity.runOnUiThread(new Runnable() {
public void run() {
mSpinner.requestFocus();
}
});
mInstrumentation.waitForIdleSync();
this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
关闭触屏模式
为了控制从测试程序中发送给模拟器或设备的按键事件,你必须关闭触屏模式。如果你不这么做,按键事件将被忽略。
关闭触摸模式,你需要在调用getActivity()启动Activity之前调用ActivityInstrumentationTestCase2.setActivityTouchMode(false)。你必须在非UI线程中运行这个调用。基于这个原因,你不能在声明有@UIThread的测试方法调用。可以在setUp()中调用。
模拟器或设备的解锁
你可能已经发现,如果模拟器或设备的键盘保护模式使得HOME画面不可用时,UI测试不能正常工作。这是因为应用程序不能接收sendKeys()的事件。避免这种情况最好的方式是在启动模拟器或设备时关闭键盘保护模式。
你还可以显式地关闭键盘保护。这需要在manifest文件中添加一个权限,然后就能在程序中关闭键盘保护。注意,你必须在发布程序之前移除这个,或者在发布的程序中禁用这个功能。
在<manifest>元素下添加<uses-permission android:name=”androd.permission.DISABLE_KEYGUARD”/>。为了关闭键盘保护,在你测试的Activity的onCreate()方法中添加以下代码:
mKeyGuardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
mLock = mKeyGuardManager.newKeyguardLock("activity_classname");
mLock.disableKeyguard();
这里,activity_classname是Activity的类名。
分享到:
相关推荐
解决Android锁屏无法继续定位的问题,我在启动定位的时候提示了一个通知,通知的主要功能就是告诉启动了定位。锁屏后通知不会提示!!!在启动定位了之后,往本地写了一个txt文件, txt文件显示的是 “时间、经纬度...
解决Android锁屏无法继续定位的问题,我在启动定位的时候提示了吐司,如果返回定位会显示"启动定位"四个字。在启动定位了之后,往本地写了一个txt文件, txt文件显示的是 “时间、经纬度”等一些信息。可查看确认...
Android中如何禁止屏幕休眠和锁屏 Android中如何禁止屏幕休眠和锁屏
Android 锁屏页面避免被杀掉,解锁会自动关闭页面。防止后台运行时被关闭。 谷歌,小米,华为 亲测可用。 重点解决魅族手机,需要授权应用获得锁屏页面权限。
本文档主要讲解锁屏的启动流程,锁屏的灭屏上锁,锁屏的亮屏解锁逻辑。 此文档适合SystemUI的初学者,能让SystemUI初学者立刻马上接手SystemUI锁屏模块。 有助于SytemUI锁屏的开发。 SystemUI锁屏初学者 SytemUI...
Android锁屏无法继续定位问题 产生问题的原因: 手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档...
android锁屏界面显示,仿播放器。android锁屏界面显示,仿播放器。使用Android Studio开发。
Android锁屏 锁屏实现开机自启动 屏蔽系统锁屏,简单易懂
Android框架浅析之锁屏(Keyguard)机制原理
android 锁屏源码demo,希望互相学习。
Android锁屏与解屏相关代码分析
主要功能 当屏幕关闭时锁屏程序启动 绘制解锁图形解锁 设置解锁图形 如何设计android锁屏程序全文共27页,当前为第5页。 主要功能 设计自己的service 设计自己的activity页面 重载自己的view 如何设计android锁屏...
Android锁屏悬浮demo,主要实现锁屏内容显示,类似锁屏软件功能,qq锁屏发送信息功能,需要开启悬浮窗权限。
Android调用系统锁屏,实现默认锁屏密码
android锁屏机制分析,详细介绍了各个类的作用
Android 锁屏源代码,一键锁屏功能
实现锁屏的小应用
Android自定义锁屏页Demo
基本的锁屏功能 可以屏蔽掉home键等等,可参考
该软件不同于常见的触摸控制的解锁方式,可完全解放按键,从而保护按键长期使用带来的损害。该软件锁屏解锁功能可根据个人喜好自主设置。 该软件通过光线感应器来控制屏幕的锁定与解锁,所以手机必须要具备光线感应...