如何使用firebase分析跟踪android片段
在我的android应用程序中,我有一个活动,它有3或4个片段,可以根据一些用户或服务器事件按顺序附加 我想在firebase中跟踪所有这些碎片作为屏幕如何使用firebase分析跟踪android片段,android,android-fragments,firebase,firebase-analytics,Android,Android Fragments,Firebase,Firebase Analytics,在我的android应用程序中,我有一个活动,它有3或4个片段,可以根据一些用户或服务器事件按顺序附加 我想在firebase中跟踪所有这些碎片作为屏幕 所以,理想情况下,如果可能的话,我是否可以在片段的onCreate中调用API,并告诉firebase用户当前在fragment1、fragment2或fragment3中 更新 由于不推荐使用setCurrentScreen,因此可以使用logEvent方法 Bundle bundle = new Bundle(); bundle.putSt
所以,理想情况下,如果可能的话,我是否可以在片段的onCreate中调用API,并告诉firebase用户当前在fragment1、fragment2或fragment3中 更新
由于不推荐使用
setCurrentScreen
,因此可以使用logEvent
方法
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, fragment.getClass().getSimpleName());
bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, fragment.getClass().getSimpleName());
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle);
我使用了以下adb命令来检查是否一切正常
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
完成此操作后,您将在logcat中看到screen\u view
事件。像这个:
10-15 13:14:13.744 V/FA-SVC(20323):记录事件:
origin=app,name=屏幕视图(\u-vs),params=Bundle[{ga\u-event\u-origin(\u-o)=app,
啮合时间毫秒(_et)=31600,
ga_上一个_类(_pc)=内容片段,
ga_上一个_id(_pi)=8077407744361472421,
上一个屏幕(_pn)=内容片段,
ga_screen_class(_sc)=TestFragment,
gau屏幕id(_si)=8077407744361472423,gau屏幕(_sn)=TestFragment]
先前的答案
有一种设置当前屏幕的特殊方法-
我使用它如下
mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());
调用该方法后,LogCat中将显示以下消息
记录事件(FE):屏幕视图(vs),
Bundle[{firebase\u event\u origin(\u o)=自动,
firebase_上一个_类(_pc)=HomeFragment,
firebase_先前的_id(_pi)=412156613087629222,
firebase_上一个_屏幕(_pn)=HomeFragment,
firebase\u screen\u class(\u sc)=统计碎片,
firebase屏幕id(_si)=412156613087629223,
firebase_屏幕(_sn)=统计碎片}]
自动活动跟踪上出现以下事件:
记录事件(FE):屏幕视图(vs),
Bundle[{firebase\u event\u origin(\u o)=自动,
firebase_上一级(_pc)=统计碎片,
firebase_先前的_id(_pi)=412156613087629223,
firebase_上一个_屏幕(_pn)=统计碎片,
firebase_screen_class(_sc)=后勤活动,
firebase_screen_id(_si)=412156613087629224}]
如您所见,它们几乎相同,因此
setCurrentScreen
工作正常
我只能在第二天在Firebase控制台中看到这些类。这对于Firebase来说是正常的-处理如此大量的数据需要时间
在这里为Artem Mostyaev的答案添加了更多的见解。GA/Firebase面板在开发版本中反映了类名,但在PROD版本中没有反映类名
fragment.getClass().getSimpleName()
这混淆了prod中的片段名称。因此GA/Firebase显示的类名类似于(a、b、ah等)
getSimpleName()在其他情况下使用也很危险
更多文献:
程序规则
-keepnames class com.somepackage.yourclass
由于已弃用,因此您可以使用firebaseAnalytics.logEvent(firebaseAnalytics.Event.SCREEN\u视图,bundle)
有一篇博客文章解释了有关手动跟踪屏幕的更多信息
以下是一个例子:
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
。请记住,某些片段可能不必更改当前屏幕,就像在查看页面
中创建的片段一样,因此我声明了一个打开val
,您可以覆盖它来更改默认行为
以下是BaseFragment
中的代码:
protected open val trackScreenView: Boolean = true
override fun onResume() {
super.onResume()
if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)
}
override val trackScreenView: Boolean = false
您可以通过在目标片段中覆盖它来禁用它:
protected open val trackScreenView: Boolean = true
override fun onResume() {
super.onResume()
if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)
}
override val trackScreenView: Boolean = false
顺便说一句,如果您正在使用组件,目前没有用于跟踪屏幕的自动解决方案,它只跟踪您的单个活动,因此您可以通过将此元数据
放入应用程序清单中来防止firebase自动屏幕报告:
<application
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- .... -->
<meta-data
android:name="google_analytics_automatic_screen_reporting_enabled"
android:value="false" />
</application>
对于使用导航UI的项目,您可以使用监听器NavController.OnDestinationChangedListener
内部onCreate()
在3个侦听器函数参数中
控制器
用于获取类名
destination
有助于通过属性android:label
别忘了清理
override fun onDestroy() {
super.onDestroy()
navController?.removeOnDestinationChangedListener(listener)
}
你认为在哪里调用这个方法是最好的?在onStart
、onResume
或其他方法中?(在片段中)onResume
是最好的选择,我认为。当您从另一个片段返回到该片段时,它将被调用。您可以在60秒内跟踪它:必须在UI线程上调用:setCurrentScreen
不推荐使用:(很好的方法,这是一种非常干净的方法!或者您可以对所有片段使用此proguard规则-keepnames类*扩展androidx.fragment.app.fragment