一般的应用不太会用到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的理解相关推荐

  1. 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 ...

  2. 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 ...

  3. 【转】 Android - LayoutInflate用法

    [转自]http://blog.csdn.net/scut1135/article/details/7055461 通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Acti ...

  4. Android 基础—— 对Context的理解与使用技巧

    一.Context 基础概念 1.什么是Context 1) Context是一个抽象类,其通用实现在ContextImpl类中. 2) Context:是一个访问application环境全局信息的 ...

  5. MTK驱动(77)---Android getevent用法

    Android getevent用法 getevent命令用法如下: Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [ ...

  6. Android studio 渐变色,android shape 之渐变色角度理解

    android shape 之渐变色角度理解 首先明确shape属于drawable的一种,汉语直译就是可绘制对象(熟悉的万物皆对象).所以shape文件在drawable文件夹下. 其次动手创建sh ...

  7. Android inflater用法

    Android inflater用法 简介 具体作用 获取layoutInflater的三种方式 源码查看 返回值结果 注意 简介 在实际的开发中layoutInflater这个类的主要的主要的作用类 ...

  8. android plurals用法

    参考 android plurals用法 对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的,所以android提供了方法getQuantityString(),它可以用来为你选择合适 ...

  9. android plurals用法(单复数)

    0.相关文章 android plurals用法 Android中的string资源占位符及Plurals string 1.使用 对一个给定的语言和数字来说,决定使用哪一个case的规则是很复杂的, ...

最新文章

  1. vin端口是什么意思_端口有无开启
  2. WPF wpf scrollviewer 触屏滚动 窗体弹跳
  3. 3/100. Merge Two Binary Trees
  4. 10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!
  5. 模型预测控制c语言程序_搭建第一个程序控制电路LED灯,体会C语言的魅力
  6. 只腐蚀毛刺 腐蚀算法_去毛刺工艺大全,一次性列举了14种方法,非常全面
  7. 03. 数组中重复的数字
  8. PIC18F26K20
  9. Function与Module的差异与应用场景
  10. 探索C/C++大数快(自然数)模板
  11. mysql doc插入数据_如何向MySQL数据库的表中录入数据.doc
  12. 当初我要是这么学习计算机网络就好了「附图文解析」
  13. 一位全减器逻辑电路图_一位全减器电路实现方法探讨
  14. 最方便的办法下载bilibili视频
  15. ESB(企业服务总线)
  16. 关于Chrome的广告和弹窗拦截插件
  17. 2021-09-10 网安实验-文件修复-BMP图片隐写
  18. mv150us无线网卡驱动linux,水星MW150US的正确驱动方式 适用于笔记本无线网卡驱动无解的情况...
  19. 世界杯杂谈之有趣的数据纪录
  20. 英语计算机查询,常见的电脑英语查询7

热门文章

  1. 魅课 OM视频会议系统 proxy.php 文件包含漏洞
  2. 如何在Google日历中显示Outlook日历
  3. Authentication failed for错误解决(Git更新密码)
  4. oracle存储过程rowcount用法,oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen...
  5. 日常知识点补漏:利用shell语言写入信息进文件
  6. 【濡白的C语言】初学者-从零开始-2(常量,一维数组,转义字符)
  7. 快速理解什么是工厂模式(简单工厂模式)
  8. 基于Junit的HttpUnit测试
  9. 知道怎样读书和选书?
  10. 郑州分销系统开发|二级分销系统开发应该如何分佣?