通过onTouch点击事件传递,利用dispatchTouchEvent来监控所有点击事件。
工具类:
//埋点监控点击事件工具类 public class BuryingPointUtils { private static BuryingBean buryingBean; private static List<BuryingBean.Data> marr = new ArrayList<>(); public static void login() { //用户登录后保存用户操作 buryingBean = new BuryingBean(); buryingBean.setName("姓名"); } public static BuryingBean getmList() { //用户退出返回所有操作日志 if (buryingBean != null) { buryingBean.setMlist(marr); // marr.clear(); LogUtils.d("返回::" + buryingBean.toString()); return buryingBean; } else { return null; } } //注册点击事件,在activity的父类base中,实现dispatchTouchEvent方法,在里面写 public static void registerRunningActivityTouchEvent() { Activity activity = getRunningActivity(); for (View view : getAllChildViews(activity.getWindow().getDecorView())) { view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (view.getId() != -1) { //捕捉到的点击事件 LogUtils.d("日志1:" + view.getId()); String viewId = activity.getResources().getResourceEntryName(view.getId()); LogUtils.d("日志 控件id:" + viewId); LogUtils.d("日志 类名::" + activity.getClass().getName()); BuryingBean.Data data = new BuryingBean.Data(); data.setActivityName(activity.getClass().getName()); data.setTime(System.currentTimeMillis()); data.setViewID(viewId); marr.add(data); return false; } return false; } return false; } }); } } //遍历所有子控件 private static List<View> getAllChildViews(View view) { List<View> allchildren = new ArrayList<View>(); if (view instanceof ViewGroup) { ViewGroup vp = (ViewGroup) view; for (int i = 0; i < vp.getChildCount(); i++) { View viewchild = vp.getChildAt(i); allchildren.add(viewchild); allchildren.addAll(getAllChildViews(viewchild)); } } return allchildren; } //获取当前运行的activity对象 @TargetApi(Build.VERSION_CODES.KITKAT) private static Activity getRunningActivity() { try { Class activityThreadClass = Class.forName("android.app.ActivityThread"); Object activityThread = activityThreadClass.getMethod("currentActivityThread") .invoke(null); Field activitiesField = activityThreadClass.getDeclaredField("mActivities"); activitiesField.setAccessible(true); ArrayMap activities = (ArrayMap) activitiesField.get(activityThread); for (Object activityRecord : activities.values()) { Class activityRecordClass = activityRecord.getClass(); Field pausedField = activityRecordClass.getDeclaredField("paused"); pausedField.setAccessible(true); if (!pausedField.getBoolean(activityRecord)) { Field activityField = activityRecordClass.getDeclaredField("activity"); activityField.setAccessible(true); return (Activity) activityField.get(activityRecord); } } } catch (Exception e) { throw new RuntimeException(e); } throw new RuntimeException("Didn't find the running activity"); } public static class BuryingBean { private String name;//登录人 List<Data> mlist; public void setName(String name) { this.name = name; } public void setMlist(List<Data> mlist) { this.mlist = mlist; } public String getName() { return name; } public List<Data> getMlist() { return mlist; } public static class Data { private String viewID;//点击的控件id private String activityName;//当前的类 private Long time;//点击时间 public void setViewID(String viewID) { this.viewID = viewID; } public void setActivityName(String activityName) { this.activityName = activityName; } public void setTime(Long time) { this.time = time; } public String getViewID() { return viewID; } public String getActivityName() { return activityName; } public Long getTime() { return time; } @Override public String toString() { return "Data{" + "viewID='" + viewID + '\'' + ", activityName='" + activityName + '\'' + ", time=" + time + '}'; } } @Override public String toString() { return "BuryingBean{" + "name='" + name + '\'' + ", mlist=" + mlist + '}'; } } }
在BaseActivity中调用
@Override public boolean dispatchTouchEvent(MotionEvent event) { // LogUtils.d("日志:dispatchTouchEvent:" + event.toString()); if (event.getAction() == MotionEvent.ACTION_UP){ BuryingPointUtils.registerRunningActivityTouchEvent(); } return super.dispatchTouchEvent(event); }