通过注解埋点

来源:互联网 发布:linux ls 命令 编辑:程序博客网 时间:2024/04/29 06:02

由于项目原来毫无框架可言,现在又需要获取程序的运行状态,考虑到工作量以及后续维护,现通过注解解决问题

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加上注解即可

0 0