1. 开启全埋点

SDK 可以自动采集一些用户行为,如 App 启动、退出、浏览页面、控件点击。初始化 SDK 时,通过 setAutoTrackEventType() 方法可以配置需要开启的全埋点类型:

// 可根据需求,自由组合
saConfigOptions.setAutoTrackEventType(SensorsAnalyticsAutoTrackEventType.APP_CLICK|
        SensorsAnalyticsAutoTrackEventType.APP_START|
        SensorsAnalyticsAutoTrackEventType.APP_END|
        SensorsAnalyticsAutoTrackEventType.APP_VIEW_SCREEN);
JAVA

App 启动、App 退出的全埋点事件采集要求系统最低版本为 API 14 (Android 4.0)。

2. 事件的忽略与补充

对于全埋点中的 App 页面浏览和 App 元素点击,在开启全埋点后,SDK 支持通过配置忽略部分页面或控件的采集,并且提供了手动触发全埋点事件的方法。部分特殊的全埋点事件在开启全埋点后,仍需调用额外的方法去打开采集。

2.1. 开启 Fragment 页面浏览事件

v1.7.10 开始,通过 trackFragmentAppViewScreen() 方法可以开启全部 Fragment 页面浏览事件的自动采集功能:

// 初始化 SDK 之后,开启自动采集 Fragment 页面浏览事件
SensorsDataAPI.sharedInstance().trackFragmentAppViewScreen();
JAVA

开启 Fragment 页面浏览事件后,通过 enableAutoTrackFragment() 方法可以指定只采集某些 Fragment 页面的信息:

// 只采集 HomeFragment 页面的浏览事件
SensorsDataAPI.sharedInstance().enableAutoTrackFragment(HomeFragment.class);
JAVA

2.2. 忽略 Fragment 页面浏览事件

v3.2.6 开始,通过 ignoreAutoTrackFragment() 方法可以忽略某些 Fragment 页面的页面浏览事件:

// 忽略单个 Fragment
SensorsDataAPI.sharedInstance().ignoreAutoTrackFragment(Class<?> fragment);
// 忽略多个 Fragment
SensorsDataAPI.sharedInstance().ignoreAutoTrackFragments(List<Class<?>> fragmentList);
JAVA

v3.2.6 开始,通过 resumeIgnoredAutoTrackFragment() 方法可以恢复被忽略的 Fragment 页面的页面浏览事件:

// 恢复单个 Fragment
SensorsDataAPI.sharedInstance().resumeIgnoredAutoTrackFragment(Class<?> fragment);
// 恢复多个 Fragment
SensorsDataAPI.sharedInstance().resumeIgnoredAutoTrackFragments(List<Class<?>> fragmentList);
JAVA

2.3. 忽略 Activity 的全埋点事件

通过 ignoreAutoTrackActivity() 方法可以忽略某个或某些 Activity 的 App 点击事件与 App 页面浏览事件:

// 忽略单个 Activity
SensorsDataAPI.sharedInstance().ignoreAutoTrackActivity(Class<?> activity);
// 忽略多个 Activity
SensorsDataAPI.sharedInstance().ignoreAutoTrackActivities(List<Class<?>> activitiesList);
JAVA

2.4. 忽略某个 View 的点击事件

通过 ignoreView() 方法可以忽略某个 View 对象的 App 点击事件:

SensorsDataAPI.sharedInstance().ignoreView(View view);
JAVA

2.5. 忽略某类控件的点击事件

通过 ignoreViewType() 方法可以忽略某种控件类型及其子类型的 App 点击事件:

SensorsDataAPI.sharedInstance().ignoreViewType(Class viewType);
JAVA

viewType 可以是 Android 常见的控件类型或自定义类型,如:CheckBox、RadioButton、ToggleButton、Switch、Button、ImageButton、CheckedTextView、TextView、ImageView、RatingBar、SeekBar、Spinner、ListView、ExpandableListView、RecyclerView、TabHost、TabLayout、MenuItem、Dialog、GridView

2.6. 忽略页面的浏览事件

通过 @SensorsDataIgnoreTrackAppViewScreen 注解可以忽略某个 Activity 或 Fragment 的 App 页面浏览事件。例如:忽略 DemoActivity 的页面浏览事件:

// 忽略 DemoActivity 的页面浏览事件
@SensorsDataIgnoreTrackAppViewScreen
public class DemoActivity extends AppCompatActivity {
}
JAVA

2.7. 手动触发页面的浏览事件

v1.7.9 开始,通过 trackViewScreen() 方法可以手动触发 App 页面浏览事件,并且该接口不受忽略等条件的限制:

//触发 Activity 的浏览页面事件
SensorsDataAPI.sharedInstance().trackViewScreen(Activity activity);
//触发 Fragment 的浏览页面事件
SensorsDataAPI.sharedInstance().trackViewScreen(Fragment fragment);
JAVA

2.8. 手动触发控件的点击事件

v3.2.6 开始,通过 trackViewAppClick() 方法可以手动触发 App 点击事件,并且该接口不受忽略等条件的限制:

//触发该 View 的点击事件
SensorsDataAPI.sharedInstance().trackViewAppClick(View view);
//触发该 View 的点击事件,并加上自定义属性
SensorsDataAPI.sharedInstance().trackViewAppClick(View view, JSONObject properties);
JAVA

2.9. 处理通过 onClick 属性设置的点击事件

通过布局文件中 android:onClick 属性配置的点击回调方法执行时无法自动触发 App 点击事件。此时可以给 android:onClick 属性对应的方法加上 @SensorsDataTrackViewOnClick 注解,这样在方法执行时,SDK 就可以自动触发 App 点击事件。例如:

布局文件:

<Button
	android:onClick="buttonOnClick"/>
XML

处理函数:

import com.sensorsdata.analytics.android.sdk.SensorsDataTrackViewOnClick;

@SensorsDataTrackViewOnClick
public void buttonOnClick(View v) {}
JAVA

2.10. 方法执行时自动触发事件

通过 @SensorsDataTrackEvent 注解可以做到:某个 public 方法被执行时,自动触发一个事件。例如:

// eventName 代表事件名,properties 代表事件属性
@SensorsDataTrackEvent(eventName = "someEventName", properties = "{"provider":"神策数据","number":100,"isLogin":true}")
public void someMethod() {}
JAVA


3. 属性的补充与修改

如果在使用全埋点 App 页面浏览和 App 元素点击时遇到如下问题:

· 需要给 App 点击事件或 App 页面浏览事件添加自定义属性
· 部分预置属性未采集到,如图片按钮采集不到 $element_content 属性,页面未采集到 $title 属性
· 采集的预置属性不符合业务需求

此时可以通过 SDK 提供的方法修改或者补充默认的属性取值。

3.1. 页面设置自定义属性

通过 ScreenAutoTracker 接口可以给页面设置自定义属性或修改预置属性的取值,实现该接口的类需要是页面对应的 Activity 类或者 Fragment 类:

public interface ScreenAutoTracker {
	String getScreenUrl();
	JSONObject getTrackProperties() throws JSONException;
}
JAVA

页面对应的类实现该接口后,SDK 触发 App 页面浏览或 App 点击时会把 getTrackProperties() 返回值中的属性加入到事件的事件属性中,把 getScreenUrl() 返回的值记录到预置属性 $url 中,预置属性 $referrer 的取值就是上一次触发 App 页面浏览时的 $url

想要覆盖其他全埋点的预置属性的话,就可以在 getTrackProperties() 返回的 JSONObject 对象中加入对应的属性名与属性值。

3.2. 设置页面标题 $title

Activity 页面浏览事件 $title 按照如下逻辑读取 Activity 的 title 属性:首先读取 activity.getTitle(),如果使用 actionBar,并且 actionBar.getTitle() 不为空,则 actionBar.getTitle() 覆盖 activity.getTitle(),如果以上两步都没有读到 title,则获取 activity 的 android:label 属性。

如果没有使用到 ActionBar 可以在 Manifest 中给相应的 Activity 设置 label ,这样 $title 字段采集的内容就会是设置的 label 内容:

<activity 
	android:label="商品详情页" 
	android:name=".DemoActivity" 
	android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
...
XML

Fragment 页面浏览事件 $title 属性默认与所在 Activity 的 $title 采集规则一致。在 SDK 2.0.0 及以上的版本可使用 @SensorsDataFragmentTitle 注解设置 Fragment 的 $title 属性的值:

@SensorsDataFragmentTitle(title = "HomeFragment")
public class HomeFragment extends Fragment {
...
}
JAVA

3.3. 设置元素 ID

SDK 默认使用 android:id 的值作为 App 点击事件的 $element_id 属性,如果元素没有设置 android:id 属性,或者设置的不符合要求,可以使用如下方法覆盖默认元素 ID:

// 给 View 对象设置元素 ID
SensorsDataAPI.sharedInstance().setViewID(View view, String viewID);
// 给 Dialog 对象设置元素 ID
SensorsDataAPI.sharedInstance().setViewID(Dialog view, String viewID);
// 给 AlertDialog 对象设置元素 ID
SensorsDataAPI.sharedInstance().setViewID(AlertDialog view, String viewID);
JAVA

注意setViewID() 设置的值优先级高于 android:id 的值。

3.4. 控件设置自定义属性

通过 setViewProperties() 方法可以扩展指定 View 对象的 App 点击事件的事件属性

SensorsDataAPI.sharedInstance().setViewProperties(View view, JSONObject properties);
JAVA

对于 ExpandableListView,不仅可以通过 setViewProperties() 来扩展 item 对应 View,也可以通过 Adapter 实现 SensorsExpandableListViewItemTrackProperties 接口来扩展事件属性。

package com.sensorsdata.analytics.android.sdk;

public interface SensorsExpandableListViewItemTrackProperties {
	/**
	 * 点击 groupPosition、childPosition 处 item 的扩展属性
	 */
	JSONObject getSensorsChildItemTrackProperties(int groupPosition, int childPosition) throws JSONException;

	/**
	 * 点击 groupPosition 处 item 的扩展属性
	 */
	JSONObject getSensorsGroupItemTrackProperties(int groupPosition) throws JSONException;
}
JAVA

对于 ListViewGridView,同样不仅可以通过 setViewProperties() 来扩展 item 对应 View,也可以通过 Adapter 实现 SensorsAdapterViewItemTrackProperties 接口来扩展事件属性。

package com.sensorsdata.analytics.android.sdk;

public interface SensorsAdapterViewItemTrackProperties {
	/**
	 * 点击 position 处 item 的扩展属性
	 */
	JSONObject getSensorsItemTrackProperties(int position) throws JSONException;
}
JAVA