$AppStart、$AppEnd 全埋點解析
對於 $AppStart 和 $AppEnd 而言,歸根結底就是判斷當前 App 是處於前臺還是處於後臺。而 Android 系統本身沒有給 App 提供相關的介面來判斷這些狀態,所以我們只能藉助其它方式來間接判斷。目前,業界也有很多種方法來判斷一個 App 是處於前臺還是後臺,以 Github 上的一個開源專案為例: ofollow,noindex" target="_blank">https://github.com/wenmingvs/AndroidProcess 這個開源專案目前提供了 6 種方案:
關於這 6 種方案詳細原始碼,可以參考開源專案。 以上這 6 種方案,各有優缺點,但同時,都無法解決下面兩個問題:
• App 有多個程序如何判斷?
• App 崩潰或者被強殺瞭如何判斷?
原理概述
對於多程序間的資料共享問題,我們採用 ContentPro- vider 機 制 來 解 決。一 方 面 ContentProvider 是 基 於 Binder 機制封裝的系統元件,目的就是解決跨程序的資料共享問題。另一方面,Android 系統提供了針對 ContentProvider 的 數 據 回 調 監 聽 ,即 ContentOb- server,這樣就更加能滿足跨程序間的資料通訊。
一般情況下,針對跨程序資料共享採用的是 ContentPro- vider + SQLite 方案,但是基於我們的實際情況,使用 SQLite 資料庫儲存一些簡單資料、標記位明顯太過重量級了。通常在 Android 系統中,針對一些比較簡單資料儲存,一般是採用 SharedPreferences 進行快速讀寫。
所以在這裡我們採用的跨程序資料共享實現方式是基於 ContentProvider + SharedPreferences 的方案。對於 App 崩潰或者應用程序被強殺的場景,我們引入了 Session 的概念。即:對於一個 App,當一個頁面退出了, 如果 30s 之內沒有新的頁面開啟,我們就認為 App 處於 後臺了;當一個頁面顯示了,如果與上一個頁面退出時間的間隔超過 30s,我們就認為 App 重新處於前臺了。
我們首先註冊一個 ActivityLifecycleCallbacks 回撥,來監聽應用程式內所有 Activity 的生命週期。處理業務時涉及到標記位的儲存以及跨程序間的資料通訊,我們採用 ContentProvider + SharedPreferences 的方式實現程序間資料共享,同時註冊 ContentObserver 來監聽跨程序間的資料通訊。
下面分兩種情況進行處理:
在頁面退出的時候(onPause),我們啟動一個倒計時 30s 定時器,如果 30s 之內沒有新的頁面顯示,則觸發 $AppEnd 事件;如果有新的頁面進來,我們儲存一個標記位來標記新頁面進來。這裡需要注意的是,由於 Activity 之間可能是跨程序的,所以標記位需要實現程序 間的共享,即通過 ContentProvider + SharedPreferenc- es 進行儲存。然後通過 ContentObserver 監聽到新頁面進來的標記位改變,然後取消定時器。如果 30s 之內沒有新的頁面進來(比如使用者按 Home 鍵 / 返回鍵退出 App、 App 崩潰、App 被強殺),我們會下次啟動的時候補發一 個 $AppEnd 事件。
在下次頁面啟動的時候(onStart),我們判斷一下與上個頁面的退出時間間隔是否超過了 30s,如果沒有超過 30s, 則無需補發 $AppEnd 事件,直接觸發 $AppScreen 事件。 接下來判斷是否已觸發 $AppEnd 事件的標記位,如果標記位為 true,則觸發 $AppStart 事件,反之不觸發;如果超過了 30s,我們判斷一下是否已經觸發了 $AppEnd 事件,如果沒有則先觸發 $AppEnd 事 件,然 後 再 觸 發 $AppStart 和 $AppScreen 事件。
實現步驟
完整的專案原始碼後續會 release 給大家。
知識點
ContentProvider
注:該內容來自神策資料使用者行為洞察研究院出品的《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 全埋點解決方案》
更多白皮書、報告、乾貨和案例,可以關注“神策資料”和“使用者行為洞察研究院”公眾號瞭解~