本文将对Android平台上的Piwik-SDK挑选一个追踪页面事件的流程进行部分源码解析。
这是Piwik-SDK的github地址:https://github.com/piwik/piwik-sdk-android
我们来看一个追踪页面事件的完整方法:
TrackHelper.track()
.screen("/custom_vars")
.title("Custom Vars")
.variable(1, "first", "var")
.variable(2, "second", "long value")
.with(getTracker());
首先我们调用track()方法获得一个TrackHelper对象:
public static TrackHelper track() {
return new TrackHelper();
}
该对象拥有screen()、event()等一系列追踪方法,该类还拥有BaseEvent用于上传数据的内部类等,功能繁多。
接下来我们看看screen()方法,它直接new一个Screen对象(Screen同样是TrackHelper的内部类),并在构造方法中初始化入参,super()方法其实是在BaseEvent类中构造一个基础的TrackHelper对象,用于获取一个baseTrackMe对象用作其它用途,在此先不详谈。
Screen(TrackHelper baseBuilder, String path) {
super(baseBuilder);
mPath = path;
}
同样的,该类的title()方法也初始化了入参:
public Screen title(String title) {
mTitle = title;
return this;
}
然后我们看看它究竟对这些参数做了什么操作:
public TrackMe build() {
if (mPath == null) return null;
final TrackMe trackMe = new TrackMe(getBaseTrackMe())
.set(QueryParams.URL_PATH, mPath)
.set(QueryParams.ACTION_NAME, mTitle);
if (mCustomVariables.size() > 0) {
//noinspection deprecation
trackMe.set(QueryParams.SCREEN_SCOPE_CUSTOM_VARIABLES, mCustomVariables.toString());
}
for (Map.Entry<Integer, String> entry : mCustomDimensions.entrySet()) {
CustomDimension.setDimension(trackMe, entry.getKey(), entry.getValue());
}
return trackMe;
}
在Screen类的build()方法里,我们看到他们被保存到了一个TrackMe对象的HashMap中,同样地,若传入了非空的自定义变量对象mCustomVariables,也一并保存。build方法返回了一个TrackMe对象,那这个方法什么时候被调用呢?没错,就是在最后调用的with()方法里:
public void with(@NonNull Tracker tracker) {
TrackMe trackMe = build();
if (track