在我的Android应用程序中,我有一个Activity,它有3个或4个片段,可以根据一些用户或服务器事件按顺序连接。
我想将所有这些片段作为firebase中的屏幕进行跟踪。
理想情况下,如果可能的话,我是否可以在片段的onCreate中调用API,并告诉firebase用户当前是在fragment1,fragment2还是fragment3?
答案 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是正常的 - 处理大量数据需要时间。
答案 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
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()在其他情况下使用也很危险。
Progaurd规则
-keepnames class com.somepackage.yourclass