1.页面浏览事件采集时机
在 Android 系统中,页面浏览其实就是指切换不同的 Activity 。对于一个 Activity,通过对 Activity 生命周期的了解可知,Activity 处于前台可见的时机其实就是 onResume(Activity activity) 的回调方法。所以,当一个 Activity 执行到 onResume(Activity activity) 生命周期时,就代表该页面已经显示出来了,即该页面被浏览了。我们只要自动的在 onResume 里触发页面浏览事件(神策中事件名为 $AppViewScreen),即可实现 Activity 页面浏览事件的采集。
2.BaseActivity 中采集页面浏览事件
要实现全埋点采集 Activity 的页面浏览事件,需要一个统一的方法去采集。首先想到的是定义一个 BaseActivity,然后让其他 Activity 继承这个 BaseActivity。在 BaseActivity 的 onResume() 方法中即可实现所有 Activity 的页面浏览事件采集。这种方法理论上是可行的,但不是最优选择,有些特殊的场景是无法适应的。比如,你在应用程序里集成了一个第三方的库,而这个库里恰巧也包含 Activity,此时你是无法让这个第三方的库也去继承你的 BaseActivity(最起码驱使第三方服务商去做这件事的难度比较大)。
3.通过 ActivityLifecycleCallbacks 采集页面浏览事件
ActivityLifecycleCallbacks 是 Application 的一个内部接口,是从 API 14(即 Android 4.0)开始提供的。Application 类通过此接口提供了一系列的回调方法,用于让开发者可以对 Activity 的所有生命周期事件进行集中处理(或称监控)。我们可以通过 Application 类提供的 registerActivityLifecycleCallback(ActivityLifecycleCallbacks callback) 方法来注册 ActivityLifecycleCallbacks 回调。在注册的 Application.ActivityLifecycleCallbacks 的 onActivityResumed(Activity activity) 回调方法中,我们可以拿到当前正在显示的 Activity 对象,通过该 Activity 对象采集页面名称、标题等相关属性,进而实现 Activity 页面浏览事件的采集。每一个Activity的生命周期都会回调相应的方法,所以通过 ActivityLifecycleCallbacks 能监听所有 Activity 的生命周期,进而实现全埋点采集。相比较于通过 BaseActivity 实现,最优的方案还是基于 Application.ActivityLifecycleCallbacks 实现。
不过,使用 Application.ActivityLifecycleCallbacks 机制实现全埋点的页面浏览事件,也有一个明显的缺点,就是注册 Application.ActivityLifecycleCallbacks 回调要求 API 14+,对于 Android 4.0 以下的版本无法通过该方式实现。
每日一问的答案中可能无法全完解读这个问题,如果您是相关技术专家或者是对本问题有自己的见解,欢迎带着「批判性」的态度阅读,指正其中的不足。