如何使用 firebase 分析跟踪 android 个片段
How to track android fragments using firebase analytics
在我的 android 应用程序中,我有一个 Activity,它有 3 或 4 个片段,可以根据某些用户或服务器事件按顺序附加。
我想在 firebase 中跟踪所有这些片段作为屏幕。
理想情况下,如果可能的话,是否有一个 API 我可以在片段的 onCreate 中调用,并告诉 firebase 用户当前在片段 1、片段 2 或片段 3 中?
更新
由于 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_view
个事件。喜欢这个:
10-15 13:14:13.744 V/FA-SVC (20323): Logging event:
origin=app,name=screen_view(_vs),params=Bundle[{ga_event_origin(_o)=app,
engagement_time_msec(_et)=31600,
ga_previous_class(_pc)=ContentsFragment,
ga_previous_id(_pi)=8077407744361472421,
ga_previous_screen(_pn)=ContentsFragment,
ga_screen_class(_sc)=TestFragment,
ga_screen_id(_si)=8077407744361472423, ga_screen(_sn)=TestFragment}]
上一个回答
有一种设置当前屏幕的特殊方法 - setCurrentScreen
我是这样使用的
mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());
调用该方法后,LogCat
中会出现以下消息
Logging event (FE): screen_view(_vs),
Bundle[{firebase_event_origin(_o)=auto,
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}]
以下事件出现在自动 activity 跟踪中:
Logging event (FE): screen_view(_vs),
Bundle[{firebase_event_origin(_o)=auto,
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 来说是正常的 - 处理如此大量的数据需要时间。
在此处为 Artem Mostyaev 的回答添加更多见解。 GA/Firebase 面板在 DEV 版本中反映了 class 名称,但在 PROD 版本中没有反映 version.The 这里的罪魁祸首是
fragment.getClass().getSimpleName()
混淆了 prod 中的片段名称。所以 GA/Firebase 显示 classname 就像 (a,b,ah, etc)
getSimpleName() 在其他情况下使用也很危险。
Progaurd 规则
-keepnames class com.somepackage.yourclass
由于 setCurrentScreen
已 弃用 您可以使用 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
代替。
有一个博客 post 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
,您可以 override
] 以更改默认行为。
这里是BaseFragment
中的代码:
protected open val trackScreenView: Boolean = true
override fun onResume() {
super.onResume()
if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)
}
您可以通过在目标中覆盖它来禁用它 Fragment
:
override val trackScreenView: Boolean = false
顺便说一下,如果你使用的是NavigationUI
组件,目前没有跟踪屏幕的自动解决方案,它只会跟踪你拥有的单个activity,这样你就可以防止firebase自动通过将此 meta-data
放入您的应用程序清单来进行屏幕报告:
<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>
对于使用 NavigationUI 的项目,您可以使用侦听器 NavController.OnDestinationChangedListener
里面onCreate()
override fun onCreate() {
super.onCreate()
.
.
.
.
navController = Navigation.findNavController(context!!, R.id.nav_host_fragment)
navController?.addOnDestinationChangedListener(listener)
}
在 3 个侦听器函数参数中,
controller
用于获取classname
destination
可用于通过属性 android:label
获取布局 xml 在 nav_host_fragment 中找到的目标名称字符串
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)
}
在我的 android 应用程序中,我有一个 Activity,它有 3 或 4 个片段,可以根据某些用户或服务器事件按顺序附加。
我想在 firebase 中跟踪所有这些片段作为屏幕。
理想情况下,如果可能的话,是否有一个 API 我可以在片段的 onCreate 中调用,并告诉 firebase 用户当前在片段 1、片段 2 或片段 3 中?
更新
由于 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_view
个事件。喜欢这个:
10-15 13:14:13.744 V/FA-SVC (20323): Logging event: origin=app,name=screen_view(_vs),params=Bundle[{ga_event_origin(_o)=app, engagement_time_msec(_et)=31600, ga_previous_class(_pc)=ContentsFragment, ga_previous_id(_pi)=8077407744361472421, ga_previous_screen(_pn)=ContentsFragment, ga_screen_class(_sc)=TestFragment, ga_screen_id(_si)=8077407744361472423, ga_screen(_sn)=TestFragment}]
上一个回答
有一种设置当前屏幕的特殊方法 - setCurrentScreen
我是这样使用的
mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());
调用该方法后,LogCat
中会出现以下消息Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, 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}]
以下事件出现在自动 activity 跟踪中:
Logging event (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, 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 来说是正常的 - 处理如此大量的数据需要时间。
在此处为 Artem Mostyaev 的回答添加更多见解。 GA/Firebase 面板在 DEV 版本中反映了 class 名称,但在 PROD 版本中没有反映 version.The 这里的罪魁祸首是
fragment.getClass().getSimpleName()
混淆了 prod 中的片段名称。所以 GA/Firebase 显示 classname 就像 (a,b,ah, etc)
getSimpleName() 在其他情况下使用也很危险。
Progaurd 规则
-keepnames class com.somepackage.yourclass
由于 setCurrentScreen
已 弃用 您可以使用 firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
代替。
有一个博客 post 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
,您可以 override
] 以更改默认行为。
这里是BaseFragment
中的代码:
protected open val trackScreenView: Boolean = true
override fun onResume() {
super.onResume()
if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)
}
您可以通过在目标中覆盖它来禁用它 Fragment
:
override val trackScreenView: Boolean = false
顺便说一下,如果你使用的是NavigationUI
组件,目前没有跟踪屏幕的自动解决方案,它只会跟踪你拥有的单个activity,这样你就可以防止firebase自动通过将此 meta-data
放入您的应用程序清单来进行屏幕报告:
<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>
对于使用 NavigationUI 的项目,您可以使用侦听器 NavController.OnDestinationChangedListener
里面onCreate()
override fun onCreate() {
super.onCreate()
.
.
.
.
navController = Navigation.findNavController(context!!, R.id.nav_host_fragment)
navController?.addOnDestinationChangedListener(listener)
}
在 3 个侦听器函数参数中,
controller
用于获取classnamedestination
可用于通过属性android:label
获取布局 xml 在 nav_host_fragment 中找到的目标名称字符串
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)
}