通过注解埋点

为了解决项目中无框架且需要获取运行状态的问题,本文提出通过注解的方式来简化工作并便于后续维护。主要步骤包括创建注解类以及在 BaseActivity 中处理监听事件的运行时间。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值