老李分享:Android -自动化埋点

 

当我们开发一款Android应用上线后,希望能收集一些用户操作的行为数据,比如用户在某个页面点击了多少次,在某个控件被点击了多少次,在某个页面停 留了多少时间等。这些数据收集起来可以交给数据分析师,他们可以统计出应用的PV或UV;或者统计应用中哪些页面最受欢迎,哪些控件点击率最低,从而来改 进应用。对于控件被点击多少次,一般做法是在控件点击事件中加入几行log代码,然后将此次的点击记录下来,最终发送到服务端,页面的点击也是类似,需要 在页面生命周期的开始加入log代码。这种插入log代码记录操作行为的方式定义为埋点。但麻烦的是,如果业务逻辑复杂,页面众多,控件众多,那就要在许多地方插入这些log代码。这是一件多么重复的事情呀!

那有没有可能自动化去埋点呢?就是将界面的打开、关闭以及控件点击的log记录放到统一的地方去处理,而不用在许多业务逻辑中加入log代码。这块统一的监控代码需要做到如下的事情:

1.可以监控到界面打开或者关闭,并将这种操作记录到log中 
2.当界面上的有控件被点击的时候,可以监控到哪个界面哪个控件被点击了,并将这些操作信息记录到log中 
3.要能实现埋点的定制,即对需要埋点的控件或者界面才记录它们的操作log

下面分析一下自动化埋点的思路。

自动化埋点的思路

首先对Android的Activity和UI做个基本的了解,然后再提供一些自动化埋点的思路。

1.Activity的生命周期

学习Android,Activity的生命周期是必修课。Activity的生命周期分为 onCreate,onStart,onResume,onPause,onStop和onDestroy,一个界面的展示和消失都会要经过这几个阶段, 所以如果监控了Activity的生命周期,就可以监控一个界面的打开、关闭以及用户在界面上停留的时间。实现这种监控方式,可以通过创造一个界面基类, 让所有业务界面去继承它,然后基类中重写所有Activity的生命周期方法,见如下代码。至于BaseActivity重写方法里做什么样的拦截处理, 这个会在下面说到。

public BaseActivity extends Activity{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //这里对Activity的生命周期进行拦截,其他的方法也是
    }}public BusinessActivity extends Activity{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   //一定要调用super的方法
        //这里写一些业务代码
        ...
    }}

2.Android的UI布局

Activity中的UI布局是层层嵌套的,很类似HTML的布局。在一个Activity中,“根”view是PhoneWindow$DecorView,可通过this.getWindow().getDecorView()获取到这个对象。通过实例说明一下,在一个空白的Activity界面中添加一个Button按钮,下图是利用hierarchyviewer截到的UI布局图。

图中的DecorView类似于HTML中的<html>标签,里面嵌套的第一层Linearlayout类似于<body>标 签。Linearlayout中有两个子view,都是FrameLayout布局,它们类似于<div>标签。第一个 FrameLayout是应用的titlebar,TextView是titlebar上的文字;第二个FrameLayout中的内容就是 Activity中的布局。可以看到最外层的采用RelativeLayout布局,里面有个Button按钮。 
先做下简单了解,下面会说到它跟自动化埋点的关系。

3.Android事件传递机制

Activity中的UI布局是层层嵌套的,如果点击一个界面上的控件,点击事件的传递是由父视图向子视图传递,然后再传到具体的控件中,这个跟HTML中的点击事件冒泡一样。我们简单看一下Android的事件传递机制是怎么实现的。

在View中关于事件响应的方法有两个:

public boolean dispatchTouchEvent(MotionEvent event)public boolean onTouchEvent(MotionEvent event)

而ViewGroup除了这个方法还有一个方法:

public boolean onInterceptTouchEvent(MotionEvent event)

这些方法的返回值都是布尔型,返回的true或false决定了一个事件的响应能不能向下传递。我们来看一下这几个方法的作用。

  • dispatchTouchEvent方法用于事件的分发,在Activity界面中所有的点击事件都要经过这个方法的分发。 返回true表示不分发事件,由当前的View来消费事件响应;返回false则继续往下分发,如果是ViewGroup则分发给 onInterceptTouchEvent进行判断是否拦截该事件。

  • onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。这个方法主要在普通控件中,比如Button。

  • onInterceptTouchEvent 是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的 onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子 View,而在Android中View中是不能再包含子View的。

老李分享:Android -自动化埋点 1的更多相关文章

  1. 老李分享:Android -自动化埋点 3

    又一个问题,代码中的writeLog方法到底要记录哪些数据作为log信息呢?log信息中最重要的是能让开发者看出来哪个界面被打开或者哪个控件被点 击.对于界面,可以记录其类名:对于控件,一般没有确定的 ...

  2. 老李分享:Android -自动化埋点 2

    除了上述的事件,Android提供了一个OnTouchListener的监听器,当事件传递到控件的时候,如果控件注册了这个监听器,则会执行监听器中的onTouch方法.同时,如果它返回true,则事件 ...

  3. 老李分享:android app自动化测试工具合集

    老李分享:android app自动化测试工具合集   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  4. 老李分享:Android性能优化之内存泄漏1

    老李分享:Android性能优化之内存泄漏   前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...

  5. 老李分享:接电话扩展之uiautomator 1

    老李分享:接电话扩展之uiautomator   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...

  6. MTFlexbox自动化埋点探索

    1. 背景 跨平台动态化技术是目前移动互联网领域的重点关注方向,它既能节约人力,又能实现业务快速上线的需求.经过十年的发展,美团App已经变成了一个承载众多业务的超级平台,众多的业务方对业务形态的快速 ...

  7. 老李分享:接口测试之jmeter

    老李分享:接口测试之jmeter   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.移动端自动化测试很多人把他仅仅理解成appu ...

  8. POPTEST老李分享修改dns ip的vbs代码

    POPTEST老李分享修改dns ip的vbs代码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...

  9. 老李分享:robotium3.6与4.0 later 的区别 1

    老李分享:robotium3.6与4.0 later 的区别   因为下载的直接是最新版本的robotium4.1版,这次碰到gridView问题时,发现网上有getCurrentListViews( ...

随机推荐

  1. [JAVA] - Java OutOfMemoryError分类

    Java OutOfMemoryError一般常遇到的分为两类,分别提示: "Java heap space" 和 "PermGen space",前面的是指j ...

  2. nodejs爬虫——汽车之家所有车型数据

    应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...

  3. 纪中集训 Day 2

    今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...

  4. redis安装(针对2.8以上版本)

    1. 下载安装包 http://redis.io/ 2. 下载tcl/tck http://124.202.164.12/files/41060000061B56BD/downloads.source ...

  5. 第八篇 一个用JS写的省市县三级联动

    前些天,做网站用需要用到一个省市县的三级联动,数据要从数据库里面读取,我想了下思路,动手写了下来.    一.思路           js利用Ajax读取控制器里面的函数,利用函数读取存储过程,返回 ...

  6. Java代理(静态/动态 JDK,cglib)

    Java的代理模式是应用非常广泛的设计模式之一,也叫作委托模式,其目的就是为其他的对象提供一个代理以控制对某个对象的访问和使用,代理类负责为委托类预处理消息,过滤消息并转发消息,以及对消息执行后续处理 ...

  7. Filebeat issue 排查--single.go:140: ERR Connecting error publishing events (retrying): dial tcp ****:5044: i/o timeout

    我个人用docker搭建了一套日志分析平台:ELK+Filebeat 在正常跑了半个多月之后,Kibana刷新日志时突然发现日志不在更新了,停在某个时刻,就再也没有新log. 首先我查看了elk,lo ...

  8. 移动端利用rem实现自适应布局

    好久没有写博客了,刚好说说最近遇到的移动端布局问题吧. 本来一直是觉得我的页面布局能力还是不错的,当然,是相对于较基础的来说还是不错的.不过,自己写的案例终归是跟实际开发有区别的,自己写案例的是觉得这 ...

  9. Struts2框架(5)---result结果集

    result结果集 上一篇文章主要讲Struts2框架(4)---Action类访问servlet这篇主要讲result结果集 在Struts.xml中的result元素指的是:指定动作类的动作方法执 ...

  10. 关于IE低版本兼容问题

    1,元素浮动之后,能设置宽度的话就给元素加宽度.如果需要宽度是内容撑开,就给它里边的块元素加上浮动: 解决方案:给需要宽度由内容撑开的元素加上浮动 css样式: <style> .box{ ...