android instrumentation 用法,Instrumentation的理解
一般的应用不太会用到instrumentation,所以网上对其介绍也比较少。
但因其强大的跟踪application及activity生命周期的功能,用于android 应用测试框架中,被做为基类使用。
查看其提供的方法,比如:callActivityOnCreate,callApplicationOnCreate,newActivity,callActivityOnNewIntent 等基本上在application和activity的所有生命周期调用中,都会先调用instrumentation的相应方法。并且针对应用内的所有activity都生效。为程序员提供了一个强大的能力,有更多的可能性进入android app框架执行流程。
对于每一个android app来说,它的总入口都是ActivityThread::main. 每一个应用的进程都有一个ActivityThread对象,而每一个ActivityThread对象都有一个Instrumentation mInstrumentation;成员变量。mInstrumentation的初始化在ActivityThread::handleBindApplication函数中:
if (data.instrumentationName !=null) {
...
java.lang.ClassLoader cl = instrContext.getClassLoader();
mInstrumentation = (Instrumentation)
cl.loadClass(data.instrumentationName.getClassName()).newInstance();
...
} else {
mInstrumentation =newInstrumentation();
}
自定义的instrumentation只能通过调用Context.startInstrementation或者命令行am instrument启动,这个过程会将目标进程杀死再重启(声明instrumention的应用与目标应用签名必需一致)。如果应用不是通过上述方式启动而是正常情况下(通过launcher或者startActivity)启动,会默认new 一个系统的Instrumentation.
如果某应用要自定义instrumentation且用于跟踪本应用内的application及activity生命周期,通过继承实现Instrumentation并反射修改ActivityThread.mInstrumentation的方法可以做到。以下是具体做法:
1、自定义Instrumentation
class MyInstrumentation extends Instrumentation {
...
};
2、反射调用修改ActivityThread.mInstrumentation
MyInstrumentation ins = new MyInstrumentation();
Class cls = Class.forName("android.app.ActivityThread"); // ActivityThread被隐藏了,所以通过这种方式获得class对象
Method mthd = cls.getDeclaredMethod("currentActivityThread", (Class[]) null); // 获取当前ActivityThread对象引用
Object currentAT = mthd.invoke(null, (Object[]) null);
Field mInstrumentation = currentAT.getClass().getDeclaredField("mInstrumentation");
mInstrumentation.setAccessible(true);//设置private变量为可读取
mInstrumentation.set(currentAT, ins); // 修改ActivityThread.mInstrumentation值
至此即可通过MyInstrumentation来跟踪应用内application及activity的生命周期。
android instrumentation 用法,Instrumentation的理解相关推荐
- does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare
在Android进行Junit单元测试的时候报以下错误: [2015-04-06 20:26:21 - adtest] adtest does not specify a android.test.I ...
- does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-l
Android junit单元测试 错误原信息: junittest does not specify a android.test.InstrumentationTestRunner instrum ...
- 【转】 Android - LayoutInflate用法
[转自]http://blog.csdn.net/scut1135/article/details/7055461 通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Acti ...
- Android 基础—— 对Context的理解与使用技巧
一.Context 基础概念 1.什么是Context 1) Context是一个抽象类,其通用实现在ContextImpl类中. 2) Context:是一个访问application环境全局信息的 ...
- MTK驱动(77)---Android getevent用法
Android getevent用法 getevent命令用法如下: Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [ ...
- Android studio 渐变色,android shape 之渐变色角度理解
android shape 之渐变色角度理解 首先明确shape属于drawable的一种,汉语直译就是可绘制对象(熟悉的万物皆对象).所以shape文件在drawable文件夹下. 其次动手创建sh ...
- Android inflater用法
Android inflater用法 简介 具体作用 获取layoutInflater的三种方式 源码查看 返回值结果 注意 简介 在实际的开发中layoutInflater这个类的主要的主要的作用类 ...
- android plurals用法
参考 android plurals用法 对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的,所以android提供了方法getQuantityString(),它可以用来为你选择合适 ...
- android plurals用法(单复数)
0.相关文章 android plurals用法 Android中的string资源占位符及Plurals string 1.使用 对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的, ...
最新文章
- vin端口是什么意思_端口有无开启
- WPF wpf scrollviewer 触屏滚动 窗体弹跳
- 3/100. Merge Two Binary Trees
- 10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!
- 模型预测控制c语言程序_搭建第一个程序控制电路LED灯,体会C语言的魅力
- 只腐蚀毛刺 腐蚀算法_去毛刺工艺大全,一次性列举了14种方法,非常全面
- 03. 数组中重复的数字
- PIC18F26K20
- Function与Module的差异与应用场景
- 探索C/C++大数快(自然数)模板
- mysql doc插入数据_如何向MySQL数据库的表中录入数据.doc
- 当初我要是这么学习计算机网络就好了「附图文解析」
- 一位全减器逻辑电路图_一位全减器电路实现方法探讨
- 最方便的办法下载bilibili视频
- ESB(企业服务总线)
- 关于Chrome的广告和弹窗拦截插件
- 2021-09-10 网安实验-文件修复-BMP图片隐写
- mv150us无线网卡驱动linux,水星MW150US的正确驱动方式 适用于笔记本无线网卡驱动无解的情况...
- 世界杯杂谈之有趣的数据纪录
- 英语计算机查询,常见的电脑英语查询7
热门文章
- 魅课 OM视频会议系统 proxy.php 文件包含漏洞
- 如何在Google日历中显示Outlook日历
- Authentication failed for错误解决(Git更新密码)
- oracle存储过程rowcount用法,oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen...
- 日常知识点补漏:利用shell语言写入信息进文件
- 【濡白的C语言】初学者-从零开始-2(常量,一维数组,转义字符)
- 快速理解什么是工厂模式(简单工厂模式)
- 基于Junit的HttpUnit测试
- 知道怎样读书和选书?
- 郑州分销系统开发|二级分销系统开发应该如何分佣?