// 上报页面浏览事件 AnalyticsSDK.track("screen_view", mapOf( "screen_name" to screenName, "screen_class" to screenClass, "title" to (activity.title?.toString() ?: ""), "intent_extras" to activity.intent?.extras?.keySet()?.joinToString() )) }
overridefunonActivityPaused(activity: Activity) { // 页面被覆盖(如跳转其他 Activity) val screenClass = activity.javaClass.name if (currentScreen == screenClass) { trackScreenEnd(screenClass) } }
privatefuntrackScreenEnd(screenClass: String) { val enterTime = screenStack[screenClass] ?: return val duration = System.currentTimeMillis() - enterTime AnalyticsSDK.track("screen_leave", mapOf( "screen_class" to screenClass, "duration_ms" to duration )) screenStack.remove(screenClass) } }
二、Fragment 页面浏览采集
Fragment 的生命周期独立于 Activity,需要使用 FragmentLifecycleCallbacks:
overridefunonFragmentResumed(fm: FragmentManager, fragment: Fragment) { val screenName = fragment.javaClass.simpleName val key = "${fragment.hashCode()}_$screenName" fragmentTimestamps[key] = System.currentTimeMillis()
// 找到宿主 Activity 组合为完整页面路径 val pagePath = "${fragment.requireActivity().javaClass.simpleName}/${screenName}"
AnalyticsSDK.track("screen_view", mapOf( "screen_name" to screenName, "page_path" to pagePath, "is_fragment" to true, "parent_activity" to fragment.requireActivity().javaClass.simpleName )) }
overridefunonFragmentPaused(fm: FragmentManager, fragment: Fragment) { val key = "${fragment.hashCode()}_${fragment.javaClass.simpleName}" val enterTime = fragmentTimestamps[key] ?: return val duration = System.currentTimeMillis() - enterTime
AnalyticsSDK.track("screen_leave", mapOf( "screen_name" to fragment.javaClass.simpleName, "duration_ms" to duration )) fragmentTimestamps.remove(key) } }