Instrumentation 的英文意思是『仪表』,但在 Android 中的功能可不是『仪表』。
它其实是 Android 系统里的一套控制方法,或者叫『钩子』。这些『钩子』可以在正常的生命周期(正常是由操作系统控制的)之外控制Android控件的运行,其实指的就是Instrumentation类提供的各种流程控制方法。我们看一点源码就知道了:
public class Instrumentation {
private ActivityThread mThread = null;
private MessageQueue mMessageQueue = null;
private Context mInstrContext;
private Context mAppContext;
private ComponentName mComponent;
private Thread mRunner;
...
public void callActivityOnCreate(Activity activity, Bundle icicle) {
prePerformCreate(activity);
activity.performCreate(icicle);
postPerformCreate(activity);
}
...
public void callActivityOnResume(Activity activity) {
activity.mResumed = true;
activity.onResume();
if (mActivityMonitors != null) {
synchronized (mSync) {
final int N = mActivityMonitors.size();
for (int i=0; i<N; i++) {
final ActivityMonitor am = mActivityMonitors.get(i);
am.match(activity, activity, activity.getIntent());
}
}
}
}
}
看起来像不像静态代理?
它会在 Activity 的生命周期方法执行时加一个钩子,用来做一些监听的工作。
Activity 的实例也是由 Instrumentation 创建的,在 ActivityThread 中:
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
}
Instumentation 说了,我创建的 Activity 实例,我要是不监听着点,那还不完蛋了。所以它一般用来进行测试,用来实现 Activity 生命周期钩子、获取 Activity 中的 View 等等。