android.app.instrumentation解析
已经在Android SDK中学习了很多关于JUnit的内容,但是感觉一直有几个问题没有解决(不知道大家是否有同样的感受)JUnit的测试都自动化的,完全是不需要任何操作的,有2个问题我一直都还没有找到答案,这2个问题如下:
- JUnit可以用来测试Android的基本组成元素:Activity、Service、Provider,那么我们如何控制这些基本元素运行的,这需要Android系统提供一些底层操作的接口才可以做到。
- 如何模拟界面操作,比如说:单击界面上的按钮、选择菜单等。
对于第二个问题,我在Cview中似乎找到了答案,Cview中提供一些界面操作的函数,例如:performClick(),看来Android SDK还是提供了一些这方面的函数来模拟各种操作。对于第一个问题,本篇对这个问题幅详细说明下。
首先我们先想下,如果要实现对Activity的测试需要些什么?首先需要创建Activity(这个Android SDK中已经提供了),然后可以控制Activity的生命周期,这些是最基本的。在Android SDK中说明过Activity的创建是异步的,也就是说当我们调用startActivty()后,这个函数立刻返回,而不是等待Activity创建好后才返回,这就需要一些同步方面的操作。将前面的概括起来就是2个方面:控制Activity的生命周期与同步方面的问题。Android SDK为我们提供了 instrument,在android.test包中InstrumentationTestCase 类有个函数getInstrumentation()以及通过adb shell am instrument启动测试例子的方法中,都提到了instrument,下面就对instrumentation详细说明。
什么是Instrumentation?
Instrumentation是执行application instrumentation代码的基类。当应用程序运行的时候instrumentation处于开启,Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的交互。Instrumentation implementation通过的AndroidManifest.xml中的<instrumentation>标签进行描述。
Instrumentation似乎有些类似与window中的“钩子(Hook)函数”,在系统与应用程序之间安装了个“”。
android.app包中Instrumentation类结构,如下图所示
其包含有2个内部类:ActivityMoniter、ActivityResult
- ActivityMoniter:有关特定的Intent的监视。一个ActivityMoniter类的实例通过函数addMonitor(Instrumentation.ActivityMonitor)添加到当前instrumentation中,一旦添加后,每当启动一个新的Activity,ActivityMoniter就会检测,如果匹配,其hit count计数更新等其他操作。一个ActivityMonitor也可以用来寻找一个Activity,通过waitForActivity()方法,这个函数将返直到匹配的活动被创建。
- ActivityResult:一个活动执行的结果说明,返回到原来的活动。
然后我们看下Instrumentation类的函数,列举其主要函数如下:
- 同步方面的操作;
- 创建一个Activity直到Activity开始运行;
- 在主线程中执行一个调用,主线程被阻滞直到调用结束 ;
- 当主线程空闲的时候(没有消息等待处理)执行一个调用;
- 同步等待主线程处于空闲期
看了这些,我们在结合前面说的2个方面:制Activity的生命周期与同步方面的问题,在Instrumentation类中都实现了,尤其是些同步操作方面的。
Instrumentation简单使用的例子
public classHelloTestextendsInstrumentationTestCase
{
Hello mActivityTested;
public HelloTest() {}
//@Override
protected voidsetUp() throws Exception
{
super.setUp();
Intent intent = new Intent();
intent.setClassName(“com.xmobileapp.hello”, Hello.class.getName());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivityTested = (Hello) getInstrumentation().startActivitySync(intent);
}
//@Override
protected voidtearDown() throws Exception
{
mActivityTested.finish();
super.tearDown();
}
}
在这里我们使用InstrumentationTestCase类的getInstrumentation()函数获取Instrumentation对象,通过Instrumentation的startActivitySync()函数启动一个Activity,直到Avtivity启动后返回。
AndroidManifest.xml中的<instrumentation>标签说明
打开AndroidManifest.xml文件后,将会看到AndroidManifest.xml编辑工具,通过这个工具我们可以很方面的在AndroidManifest.xml添加元素
选择Instrumentation面板后,我们就可以编辑Instrumentation标签了,界面如何操作在这里就不说明了,主要说明属性值的意义:
总结说明
学习完了Instrumentation,心中的很多问题都没有了,还需要到Android SDK中去深入的学习这个类,才能更好的测试Activity对象。
android.app.instrumentation解析相关推荐
- java.lang.IllegalAccessException: class xxx is not accessible from class android.app.Instrumentation
java.lang.IllegalAccessException: class xxx is not accessible from class android.app.Instrumentation ...
- c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...
在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...
- android email分析,解析sohu邮箱的邮件内容报错~!~!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我是使用javamail来接收邮件的,网上的这种程序很多,但是无法解析sohu邮箱的邮件内容(其他邮箱没问题的),求高人指点下,在下不胜感激-! 报错如下 ...
- 解决: is not accessible from java.lang.Class android.app.AppComponentFactory
堆栈如下: Caused by: java.lang.IllegalAccessException: java.lang.Class<com.MainActivity> is not ac ...
- android app 目标版本,android – 在gradle中使用目标sdk版本23时,ZBA...
我在我的项目中使用zbar扫描程序库.更新到sdk 23后,Marshmallow扫描仪无法正常工作.以下是gradle文件.如果我将targetSdkVersion设置为23以外的任何东西,扫描仪正 ...
- Android App Bundle(aab)与UnsatisfiedLinkError
一.起因 所做项目因为是在Google Play市场,并且在2019.8.1开始,必须要携带64位so库,又因为所做App涉及到C层库比较多.大概有10MB左右.所以使用了Google最新的Andro ...
- android.app.fragment instantiationexception,recreate导致的Fragment报的错误
在做夜间模式的时候在Fragment中调用了recreate()然后就报了这个错误 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.xxxx. ...
- Android App Bundle
1. Android App Bundle 是什么? 从 2021 年 8 月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布. Android App ...
- Android App Bundles(谷歌官方动态化框架)
提纲 是什么(Android App Bundles简介) 为什么使用(aab的四个新功能及实用性) 怎么使用(怎么进行aab的改造) 怎么测试(可以通过google市场测试 而本文主要介绍aab本地 ...
最新文章
- 多媒体视像会议中音视频矩阵的用途
- 纹理对象的实时姿态估计
- S3C6410禁用和启用触摸屏
- c# 写入xml 怪异的事情
- tensorboard 数据降维分布图_以mnist为例探究tensorboard
- Java中的Type接口和Class类有什么区别
- C# - 类_使用新成员隐藏基类成员
- nginx解析漏洞 只要可以上传文件就会被黑
- GridView xml中设置android:focusable=false无效的原因
- 点餐系统的设计(一)
- update fabric from 1.3 to 1.8
- 计算相同维度向量之间的欧氏距离
- Linux之find + sed组合替换命令
- luoguP3507 [POI2010]GRA 性质 + 动态规划
- 常见的网络命令--ping.hostname
- docker安装kafka和zookeeper
- 2021年安全员-C证(陕西省)考试资料及安全员-C证(陕西省)免费试题
- php shopnc.dll,shopnc开发手册-ZX版.doc
- python人工智能面试题爱奇艺面试题_经典算法题:爱奇艺研发工程师算法笔试题...
- SSM 博客系统开发实战
热门文章
- Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
- 孤零零好可怜的光棍节
- Redis数据类型详解(五种)
- k8s上安装并初始化Helm。minikube
- ASP.NET Web API 异常日志记录
- 字幕在看着你:利用恶意字幕文件劫持计算机
- # 20155224 第十一周 课堂练习《计算后缀表达式的值》
- 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
- Mysql一些重要配置参数的学习与整理(二)
- SPIRE.DOC - .NET开发者的福利