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

如何使用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

在我的android应用程序中,我有一个活动,它有3或4个片段,可以根据一些用户或服务器事件按顺序附加

我想在firebase中跟踪所有这些碎片作为屏幕


所以,理想情况下,如果可能的话,我是否可以在片段的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