由于项目原来毫无框架可言,现在又需要获取程序的运行状态,考虑到工作量以及后续维护,现通过注解解决问题
1、控件都是通过setOnClickListener加监听的,现在要对所有的监听加上其运行时间
步骤 1、添加注解类
2、在BaseActivity中添加
InjectUtils.inject(this);
3、import android.app.Activity; import android.graphics.Path; import android.provider.SyncStateContract; import android.util.Log; import android.view.View; import java.lang.reflect.Field; /** * Created by 邱乾坤 on 2017/3/4. */ public class InjectUtils { public static long CLICK_TIME; public static void inject(Activity activity) { intectEvents(activity); } private static void intectEvents(Activity activity) { Class<? extends Activity> clazz = activity.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { OnClick onClick = field.getAnnotation(OnClick.class); if (onClick != null) {//发现控件 int viewId = onClick.value(); View view = activity.findViewById(viewId); Class viewClass = view.getClass(); try {//通过源码发现Listener是封装在内部类的一个属性,通过反射获取内部类实例,在反射得到监听事件,再通过代理模式获取时间 Field field1 = viewClass.getSuperclass().getSuperclass().getDeclaredField("mListenerInfo"); field1.setAccessible(true); Object target = field1.get(view); // Class aClass = Class.forName(field1.getType().getName()); Field field2 = target.getClass().getDeclaredField("mOnClickListener"); field2.setAccessible(true); View.OnClickListener listener = (View.OnClickListener) field2.get(target); view.setOnClickListener(new MyClickListener(listener)); } catch (Exception e) { e.printStackTrace(); } } } } public static class MyClickListener implements View.OnClickListener { private View.OnClickListener listener; public MyClickListener(View.OnClickListener listener) { this.listener = listener; } @Override public void onClick(View view) { //CLICK_TIME = 0; CLICK_TIME = System.currentTimeMillis(); Log.e("onClick", CLICK_TIME + ""); listener.onClick(view); } } }对每个view加上注解即可