$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 更詳細的資訊,可以參考如下連結: ofollow,noindex" target="_blank">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 全埋點解決方案》白皮書,檢視完整白皮書可點選 360775e118954518de2c?utm_source=WeChat&utm_medium=free&utm_term=%e9%98%85%e8%af%bb%e5%8e%9f%e6%96%87&utm_content=%e7%99%bd%e7%9a%ae%e4%b9%a6-Android%e5%85%a8%e5%9f%8b%e7%82%b9&utm_campaign=sensorsdata2" rel="nofollow,noindex" target="_blank">《Android 全埋點解決方案》
更多白皮書、報告、乾貨和案例,可以關注“神策資料”和“使用者行為洞察研究院”公眾號瞭解~