jsonObject.put(“pageId”, SensorsDataPrivate.getCurrentActivity().getClass().getCanonicalName());
jsonObject.put(“sessionId”, UUID.randomUUID().toString().replace("-", “”));
Log.i(TAG, SensorsDataPrivate.formatJson(jsonObject.toString()));
} catch (Exception e) {
e.printStackTrace();
}
}
这里也很简单,先后创建了两个JSONObject,一个是最外层的jsonObject
,一个是作为参数使用的sendProperties
,然后又把传过来的参数合并到sendProperties中,然后sendProperties作为extras
的value
使用。
endTime
结束时间就取当前时间。
sessionId
表示是这个埋点的唯一标示,看自己需求,非必须。
最后调用了Log
打印出来,来看一下最后完整的数据:
{
“event”: “$AppViewScreen”,
“extras”: {
“app_name”: “TrackDemo”,
“screen_width”: 1440,
“screen_height”: 2621,
“app_version”: “1.0”,
“os_version”: “10”,
“model”: “Android SDK built for x86”,
“manufacturer”: “Google”,
“activity”: “com.yechaoa.trackdemo.ui.MainActivity”
},
“beginTime”: 1603279291751,
“endTime”: 1603279293759,
“pageId”: “com.yechaoa.trackdemo.ui.MainActivity”,
“sessionId”: “5dbb96807e634b6498f897784972ade3”
}
可以看到除了我们必要的参数之外,还有一些附加参数,比如手机型号、系统版本
等等。
Fragment
上面是Activity的埋点,关于fragment
书中并没有讲解,不过我们也可以按照生命周期
的方式来处理,比如在BaseFragment
中进行统一埋点,又或者单独处理,正好演示一下手动埋点
的操作。
示例:
private var mBeginTime = 0L
override fun onResume() {
super.onResume()
mBeginTime = System.currentTimeMillis()
}
首先在onResume
中记录一下开始时间。
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
val blankFragment = this
if (hidden) {
val activity = activity as SecondActivity
val jsonObject = JSONObject()
jsonObject.put(“useActivity”, true)
jsonObject.put(“fragment”, activity.javaClass.canonicalName + blankFragment.javaClass.canonicalName + “-custom”
)
SensorsDataAPI.getInstance().track(“AppViewScreen”, jsonObject, mBeginTime)
}
}
然后在onHiddenChanged
中判断显示与否进行埋点,自定义数据,然后调用track
方法进行埋点。
唯一标示的key用fragment表示,value用当前引用的activity全路径
,加上fragment的全路径
,最后加上自定义的参数,即可作为唯一标示
。
以上即为页面埋点的主要代码,以及一些关键的代码细节,最后附Demo地址。