Android全埋点解决方案
上QQ阅读APP看书,第一时间看更新

1.2 View绑定listener方式

随着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的不同方式,对于我们研究或者选择全埋点的方案,都会有非常大的帮助。