如何使用firebase分析跟踪android片段

时间:2017-07-19 21:28:30

标签: android android-fragments firebase firebase-analytics

在我的Android应用程序中,我有一个Activity,它有3个或4个片段,可以根据一些用户或服务器事件按顺序连接。

我想将所有这些片段作为firebase中的屏幕进行跟踪。

理想情况下,如果可能的话,我是否可以在片段的onCreate中调用API,并告诉firebase用户当前是在fragment1,fragment2还是fragment3?

4 个答案:

答案 0 :(得分:38)

设置当前屏幕有一种特殊方法 - setCurrentScreen

我用它如下

mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());

调用该方法后,LogCat中会显示以下消息

  

记录事件(FE):screen_view(_vs),   束[{firebase_event_origin(_O)=汽车,   firebase_previous_class(_PC)= HomeFragment,   firebase_previous_id(_pi)= 4121566113087629222,   firebase_previous_screen(_pn)= HomeFragment,   firebase_screen_class(_sc)= StatisticsFragment,   firebase_screen_id(_si)= 4121566113087629223,   firebase_screen(_SN)= StatisticsFragment}]

自动活动跟踪中会显示以下事件:

  

记录事件(FE):screen_view(_vs),   束[{firebase_event_origin(_O)=汽车,   firebase_previous_class(_PC)= StatisticsFragment,   firebase_previous_id(_pi)= 4121566113087629223,   firebase_previous_screen(_pn)= StatisticsFragment,   firebase_screen_class(_sc)= LoginActivity,   firebase_screen_id(_si)= 4121566113087629224}]

如您所见,它们几乎相同,因此setCurrentScreen正在发挥作用。

我只能在第二天在Firebase控制台中看到这些类。 Firebase是正常的 - 处理大量数据需要时间。

Firebase Console

答案 1 :(得分:9)

已弃用setCurrentScreen ,您可以改用firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)

有一篇博客文章here,其中介绍了有关手动跟踪屏幕的更多信息。

这是一个示例:

private fun setCurrentScreen(screenName: String) = firebaseAnalytics?.run {
    val bundle = Bundle()
    bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, screenName)
    bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, this@BaseFragment.javaClass.simpleName)
    logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
}

此外,如果您要自动跟踪屏幕,则可以使用BaseFragment之类的onResume生命周期方法之一调用此函数。请记住,某些片段可能不必更改当前屏幕,例如在ViewPager中创建的片段,因此我声明了一个open val,您可以{{1} },以更改默认行为。

这是override中的代码:

BaseFragment

,您可以通过在目标protected open val trackScreenView: Boolean = true override fun onResume() { super.onResume() if (trackScreenView) setCurrentScreen(this.javaClass.simpleName) } 中覆盖它来禁用它:

Fragment

顺便说一句,如果您使用的是NavigationUI组件,则目前尚无用于跟踪屏幕的自动解决方案,它仅跟踪您拥有的单个活动,因此您可以通过将{ {1}}在您的应用清单中:

override val trackScreenView: Boolean = false

答案 2 :(得分:5)

对于使用 NavigationUI 的项目,您可以使用监听器 NavController.OnDestinationChangedListener

内部onCreate()

override fun onCreate() {
      super.onCreate()
      .
      .
      .
      .
      navController = Navigation.findNavController(context!!, R.id.nav_host_fragment)
      navController?.addOnDestinationChangedListener(listener)
}

3 个监听器函数参数中,

  • controller 对获取类名很有用
  • destination 可用于通过属性 android:label
  • 获取在 nav_host_fragment 中找到的目的地的布局 xml 名称字符串
private val listener = NavController.OnDestinationChangedListener { controller, destination, arguments ->
      
      val bundle = Bundle()
      val currentFragmentClassName = (controller.currentDestination as FragmentNavigator.Destination).className
      bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, destination.label.toString())
      bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, currentFragmentClassName)
      FirebaseAnalytics.getInstance(requireContext()).logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
      
}

别忘了清理

override fun onDestroy() {
      super.onDestroy()
      navController?.removeOnDestinationChangedListener(listener)
}

答案 3 :(得分:0)

在此处为Artem Mostyaev答案添加更多见解。 GA / Firebase面板在DEV版本中反映了类名称,但在PROD版本中没有反映。这里的主要罪魁祸首是

fragment.getClass().getSimpleName()

混淆了prod中的片段名称。因此,GA / Firebase的类名显示为(a,b,ah等)

getSimpleName()在其他情况下使用也很危险。

更多文献资料:https://medium.com/@elye.project/the-danger-of-using-class-getsimplename-as-tag-for-fragment-5cdf3a35bfe2

Progaurd规则

-keepnames class com.somepackage.yourclass