Android可视化埋点(无埋点)的具体实现

Android埋点技术深入探究


上一篇文章提到的无埋点技术在实际应用中有以下几个问题需要处理。
大纲:
【1】控件的唯一标识问题怎么处理。
【2】当控件处于可滑动的组件内或者整个界面就是一个可滑动的View中时位置如何确定。
【3】Fragment中如何得到触摸点的坐标。
【4】Activity界面留存时间。

第一个问题:控件的唯一标识问题,上一篇文章也是参考了其他的博客,说用控件的路径来标识。这种方式先不说获取到正确的路径就是一件比较难处理的事情,而且服务器端制定埋点位置时需要考虑不同版本的路径不一样,修改了布局文件后路径就需要更新。同时考虑到95%以上需要埋点的控件都是设置了id的,不会因为埋点而故意加id,所以用控件的id做唯一标识。
第二个问题:因为之前使用了View的getHitRect()方法获取view的位置坐标,当滑动后坐标不准确了,参考资料后发现可以使用getGlobalVisibleRect()方法。参考:http://stackoverflow.com/questions/13927718/view-gethitrectrect-not-working
第三个问题:因为Fragment中没有dispatchTouchEvent()方法,所以这里解决方法是定义一个接口,将Activity中得到的x,y坐标传递给Fragment,然后Fragment中自己寻找View,完成埋点。
第四个问题:在onCreate()中获取开始时间,在onPause中获取结束时间。

还是给一个Demo辅助说明,这里将埋点定义在基类中,更符合实际生产环境。
下面上代码:
在onCreate中做了两件事,一是记录进入的Activity并计时;二是初始化埋点列表,在实际中埋点列表数据通过服务器获取。

    @Override
    protected void onCreate(Bundle savedInstance){
        super.onCreate(savedInstance);
        startTime = System.currentTimeMillis();
        Log.v("out" , "进入了:"+(Activity)this);
        /*初始化一个需要埋点的列表*/
        ids.add(R.id.login);
        ids.add(R.id.register);
        ids.add(R.id.register_hidden);
        ids.add(R.id.man);
        ids.add(R.id.woman);
        ids.add(R.id.seekbar);
        ids.add(R.id.checkbox);
        ids.add(R.id.img);
        ids.add(R.id.last);
        ids.add(R.id.fragment_a_tv_login);
        ids.add(R.id.fragment_a_tv_register);
        ids.add(R.id.left);
    }

然后是设置接口回调,作用是将点击坐标回传给Fragment。

    public void setDispatchTouchEventable(DispatchTouchEventable dispatchTouchEventable){
        this.dispatchTouchEventable = dispatchTouchEventable;
    }

接下来是分发点击事件。

    /*重写dispatchTouchEvent*/
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if(ev.getAction() == MotionEvent.ACTION_UP){
            /*获取当前点击位置,遍历布局,获取当前点击位置对应的view,根据view映射路径,与json文件中的对比*/
            int x = (int) ev.getRawX();
            int y = (int) ev.getRawY();

            /*json串中根据Activity值只获取当前Activity的埋点View*/
            for(int id:ids){
                View view = findViewById(id);
                if(view == null) continue;
                view.getGlobalVisibleRect(rect);
                if(rect.contains(x ,y )){
                    Log.v("out" , "埋点id:"+id);
                    return super.dispatchTouchEvent(ev);
                }
            }
            /*如果运行到这了,说明上面的遍历没有找到,那么当前的view是在fragment中*/
            dispatchTouchEventable.point(x , y);

        }
        return super.dispatchTouchEvent(ev);
    }

这里写图片描述

接下来是Fragment中的写法:

    @Override
    public View onCreateView(LayoutInflater layoutInflater , ViewGroup viewGroup , Bundle savedInstance){
        super.onCreateView(layoutInflater , viewGroup , savedInstance);
        view = layoutInflater.from(getActivity()).inflate(R.layout.fragment_a , null);
        ids.add(R.id.fragment_a_tv_login);
        ids.add(R.id.fragment_a_tv_register);
        ((BaseActivity)getActivity()).setDispatchTouchEventable(new DispatchTouchEventable() {
            @Override
            public void point(int x, int y) {
                for(int id:ids){
                    View currentview = view.findViewById(id);
                    if(currentview == null) continue;
                    currentview.getGlobalVisibleRect(rect);
                    if(rect.contains(x ,y )){
                        Log.v("out" , "埋点id:"+id);
                    }
                }
            }
        });
        return view;
    }
总结:基本实现了无埋点技术,在实际生产环境中无须在代码中手动埋点,只需继承该基类,服务器端配置好埋点列表即可。实际应用中应该考虑埋点数据的格式,避免每点击一次都要遍历所有的id,同时,弹出框,RecyclerView,ListView等的Item点击还不能实现。这些地方需要埋点的可能性较小,如果确实需要,可以代码埋点辅助。
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可视化埋点和代码埋点都是常见的数据采集方式,但它们的实现方式有所不同。 代码埋点指的是在应用程序的代码中嵌入特定的代码段,以便在应用程序运行时收集特定的数据。开发人员需要手动编写和维护这些代码,以确保数据采集的正确性和完整性。 而可视化埋点则是通过可视化界面来配置和管理数据采集,在应用程序中不需要手动编写代码。用户可以在可视化界面中定义需要采集的页面元素或事件,并指定需要采集的数据类型和参数。这些配置信息会被转换为代码,自动插入到应用程序中。 下面是两种埋点方式的对比: 1. 实现难度:代码埋点需要开发人员手动编写和维护代码,需要一定的技术能力。而可视化埋点则不需要编写代码,只需要通过可视化界面进行配置。 2. 精度和完整性:代码埋点可以采集更详细和准确的数据,因为开发人员可以更精细地控制采集的过程。而可视化埋点则有可能遗漏某些数据,或者采集到错误的数据,因为它是通过配置界面来实现的。 3. 可维护性:代码埋点需要开发人员手动编写和维护代码,对于大型应用程序来说,维护成本会很高。而可视化埋点则可以通过可视化界面进行修改和维护,对于非开发人员来说更加容易。 综上所述,代码埋点可视化埋点各有优缺点,选择哪种方式需要考虑具体情况。如果需要采集更详细和准确的数据,或者应用程序比较小,那么代码埋点可能更适合;如果需要快速配置和管理数据采集,或者应用程序比较大,那么可视化埋点可能更适合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值