$AppClick 全埋点之代理 Window.Callback

栏目: IOS · Android · 发布时间: 5年前

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

$AppClick 全埋点之代理 Window.Callback

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 全埋点解决方案》

更多白皮书、报告、干货和案例,可以关注“神策数据”和“用户行为洞察研究院”公众号了解~ $AppClick 全埋点之代理 Window.Callback


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Nature of Code

The Nature of Code

Daniel Shiffman / The Nature of Code / 2012-12-13 / GBP 19.95

How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital w......一起来看看 《The Nature of Code》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码