有需求需要统计本应用内各Activity切换的次数与频度等,由于之前架构设计并未让所有Activity共同继承于一个基础类,同时TabActivity、FragmentActivity等的使用也没法让它们使用同一个父类,因此在本着不想改动每个Activity的目的下,我们摸索出了一个使用反射的方式来实现本应用内部Activity切换时的拦截,具体说来就是拦截本应用中每一个Activity的onPause和onResume事件。
基本思路:
访问ActivityThread的静态方法currentActivityThread拿到当前ActivityThread的实例,再通过反射拿到其private的mInstrumentation对象,并设置一个新的对象给此Field。该新的对象继承自Instramentation,重写了callActivityonPause和callActivityonResume方法,并在方法体内调用了之前旧的Instrumentation对象的同名方法。
ActivityThreadHooker.java
package com.testme.testinstr;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Instrumentation;
import android.util.Log;
public class ActivityThreadHooker {
private static final String TAG = "ATHOOK";
private static ActivityThreadHooker instance = null;
p