通过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);
}









