Window.Callback

Window.Callback 是 Window 的 一 个 内 部 接 口。该 接 口 包 含 了 一 系 列 的 类 似 于 dispatchXXX 和 onXXX 的接口。当 Window 接收到外界的状态改变通知时就会回调其 中的相应方法。比如,当用户点击某个控件时,就会回调 Window.Callback 中的 dispatchTouchEvent(MotionEvent event) 方法。

Window.Callback 定义如下:
/**
* API from a Window back to its caller. This allows the client to

* intercept key dispatching, panels and menus, etc.
/
public interface Callback {

……

/*
*

* Called to process touch screen events. At the very least your
* implementation must call
* {@link android.view.Window#superDispatchTouchEvent} to do the
* standard touch screen processing.
*
* @param event The touch screen event.
*
* @return boolean Return true if this event was consumed.
*/
public boolean dispatchTouchEvent(MotionEvent event);

……
}

关于 Window.callback 更详细的信息,可以参考如下链接: http://www.android-doc.com/reference/android/view/Window.Callback.html 15 数据驱动白皮书 Android 全埋点技术白皮书

原理概述

在应用程序自定义的 Application 的 onCreate() 方法中初始化埋点 SDK,并传入当前的 Application 对象。SDK 在拿到这个 Application 对象之后,通过 application.register- ActivityLifecycleCallback 注册 Application.ActivityLifecycleCallbacks。这样 SDK 就能对 App 中所有的 Activity 的生命周期事件进行集中处理(监控)了。在 ActivityLife- cycleCallbacks 的 onActivityCreated(Activity activity, Bundle bundle) 回调 方法中,我们就可以拿到当前正在显示的 Activity 对象,通过 activity.getWindow() 方法可以拿到这个 Activity 对应的 Window 对象,再通过 window.getCallback() 方法就可以拿到 Window.Callback 对象,最后通过自定义的 WrapperWindowCallback 代理这个 Window.Callback 对象。然后在 WrapperWindowCallback 的 dispatchTouchEvent (MotionEvent event) 方法中通过 MotionEvent 参数找到那个被点击的 View,插入埋点代码,最后再调用 原有 Window.Callback 的 dispatchTouchEvent(MotionEvent event) 方法,即可达到自动埋点的效果。

实现步骤

完整的项目源码后续会 release 给大家。

缺点

• 由于每次点击触发时,都需要遍历一次 RootView,所以效率比较低,对 App 整体性 能影响比较大

• view.hasOnClickListeners() 要求 API 15+

• Application.ActivityLifecycleCallbacks 要求 API 14+

• 无法采集 Dialog、PopupWindow 的点击事件

知识点

• Window.callback

• Application.ActivityLifecycleCallbacks

• ViewTreeObserver.OnGlobalLayoutListener

• 代理

参考资料

[1] https://github.com/hellozhixue/BehaviorCollect

注:该内容来自神策数据用户行为洞察研究院出品的《Android 全埋点解决方案》白皮书,查看完整白皮书可点击《Android 全埋点解决方案》

更多白皮书、报告、干货和案例,可以关注“神策数据”和“用户行为洞察研究院”公众号了解~