Android 全埋点解决方案 (3):全埋点概述 1.2

阅读数:11 2019 年 11 月 30 日 22:55

Android全埋点解决方案(3):全埋点概述 1.2

(View 绑定 listener 方式)

内容简介
这是一本实战为导向的、翔实的 Android 全埋点技术与解决方案手册,是国内知名大数据公司神策数据在该领域多年实践经验的总结。由神策数据合肥研发中心负责人亲自执笔,他在 Android 领域有近 10 年研发经验,开发和维护着知名的商用开源 Android & iOS 数据埋点 SDK。
本书详细阐述了 Android 全埋点的 8 种解决方案,涵盖各种场景,从 0 到 1 详解技术原理和实现步骤,并且提供完整的源代码,各级研发工程师均可借此实现全埋点数据采集,为市场解开全埋点的神秘面纱。
8 种 Android 全埋点解决方案包括:
AppClick 全埋点方案 1:代理 View.OnClickListener、
AppClick 全埋点方案 2:代理 Window.Callback
AppClick 全埋点方案 3:代理 View.AccessibilityDelegate
AppClick 全埋点方案 4:透明层
AppClick 全埋点方案 5:AspectJ
AppClick 全埋点方案 6:ASM
AppClick 全埋点方案 7:Javassist
AppClick 全埋点方案 8:AST

随着 Android 相关技术的不断更新迭代,给 View 绑定 listener 的方式也是多种多样的。下面以 Button 为例来介绍日常开发中比较常见的几种绑定 listener 的方式。

  • 通过代码来设置 listener
复制代码
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//do something
}
});

这种方式是目前开发中最常用的方式,也是我们全埋点方案需要重点解决和重点支持的方式。

  • 通过 android:onClick 属性绑定 listener

先在布局文件中声明 Button 的 android:onClick 属性,如:

复制代码
<android.support.v7.widget.AppCompatButton
android:id="@+id/xmlOnClick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="xmlOnClick"
android:text="android:onClick 绑定 OnClickListener"/>

我们设置 android:onClick 的属性值为“xmlOnClick”,此时的“xmlOnClick”代表点击处理逻辑对应的方法名。然后在对应的 Activity 文件中声明 android:onClick 属性指定的方法 xmlOnClick:

复制代码
public void xmlOnClick(View view) {
//do something
}

注意:该方法必须有且仅有一个 View 类型的参数。

这种方式在一些新的项目中不是很常见,在一些比较老的 Android 项目中可能会有这样大量的使用方式。

  • 通过注解绑定 listener

目前有很多第三方的库都提供了类似的功能,下面以 ButterKnife 为例:

复制代码
@OnClick({R2.id.butterknife})
public void butterKnifeButtonOnClick(View view) {
//do something
}

首先定义一个方法,并且该方法有且仅有一个 View 类型的参数,然后在该方法上使用 ButterKnife 的 @OnClick 注解声明,其中的参数代表控件的 android:id。

这种方式,也是目前比较流行的其中一种使用方式。

关于 ButterKnife 更详细用法可以参考其官网: https://github.com/JakeWharton/butterknife

  • listener 含有 Lambda 语法

Lambda 是 Java8 开始支持的,如:

复制代码
AppCompatButton button = findViewById(R.id.lamdbaButton);
button.setOnClickListener(view ->Log.i("MainActivity", "Lambda OnClick"));

这种方式,也是目前比较流行的一种使用方式。

事实上,这根本就不算一种绑定 listener 的方式,只是绑定的 listener 中含有 Lambda 语法而已。之所以在这里要提到它,是因为这种方式会对我们选择全埋点方案时产生一定的影响,比如后面将要介绍的 AspectJ 全埋点方案目前就无法支持这种带有 Lambda 语法的点击事件。

关于 Lambda 的详细信息可以参考: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

  • 通过 DataBinding 绑定 listener

先在布局文件中声明 android:onClick 属性:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="handlers"
type="cn.sensorsdata.autotrack.android.app.MainActivity" />
</data>
<LinearLayoutxmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<android.support.v7.widget.AppCompatButton
android:id="@+id/dataBinding"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{handlers::dataBindingOnClick}"
android:text="DataBinding 绑定 OnClickListener"
android:textAllCaps="false" />
</LinearLayout>
</layout>

android:onClick 属性值为“@{handlers::dataBindingOnClick}”,意为该按钮的点击处理逻辑为 handlers 对象的 dataBindingOnClick 方法,其中 handlers 对象是 MainActivity 的实例.

然后在对应的 Java 文件中声明 android:onClick 属性指定的方法 dataBindingOnClick:

复制代码
public void dataBindingOnClick(View view) {
//do something
}

注意:该方法必须有且仅有一个 View 类型的参数。

这种方式,也是目前新流行的一种使用方式。

关于 DataBinding 更详细的用法请参考官网: https://developer.android.com/topic/libraries/data-binding/index.html

由于全埋点重点解决的是控件的点击行为数据,所以了解控件都能设置哪些 listener,以及设置或者绑定 listener 的不同方式,对于我们研究或者选择全埋点的方案,都会有非常大的帮助。

Android全埋点解决方案(3):全埋点概述 1.2

购书地址 https://item.jd.com/12574672.html?dist=jd

评论

发布