持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
上一篇文章 Android - 接入 Firebase Analytics 和 Crashlytics ,接入后需要学习 Event 如何使用
Event 可让您了解您的应用中发生了什么,例如用户操作、系统事件或错误。
Analytics 会自动为您记录一些事件,您无需为此添加任何代码。如果应用需要收集其他数据,您可以在其中记录多达 500 种不同的 Analytics 事件类型。应用可记录的事件总量不受限制。请注意,事件名称区分大小写。即便两个事件的名称只是大小写不同,系统也会将其视作两种不同的事件。
Event
限制
- 事件最多记录 500 种
创建 FirebaseAnalytics
实例
val firebaseAnalytics: FirebaseAnalytics by lazy { Firebase.analytics }
记录事件
Analytics SDK 定义了许多常见于各类型应用(零售、电子商务、差旅以及游戏应用等)的推荐事件。如需详细了解这些事件及其适用情形,请参阅推荐事件。
下面为记录事件的两种方式,logEvent
方法第一个参数为 事件名,第二个参数为参数集合体,可以用 Bundle 表示,也可以用 Firebase 自带的函数也就是第一种方式。
firebaseAnalytics.logEvent("test_event") {
param("time", "2022-6-26")
}
firebaseAnalytics.logEvent("test_event", Bundle().apply {
putString("time", "2022-6-26")
})
设置默认事件参数
设置的默认参数会跟随未来发生的所有事件,相当于设置了公共的事件参数。
firebaseAnalytics.setDefaultEventParameters(bundle)
清除默认参数,只需要设置为 null
firebaseAnalytics.setDefaultEventParameters(null)
设置用户属性
Analytics 会自动记录一些用户属性,您无需为此添加任何代码。如果您需要收集其他数据,可以为每个项目设置各种用户属性,最多可达 25 种。请注意,用户属性名称区分大小写。即便您设置的两个用户属性只是名称的大小写不同,Analytics 也会将它们当成两个完全不同的用户属性来记录。
firebaseAnalytics.setUserProperty("country", "China")
调试事件
要在 Android 设备上启用 Analytics 调试模式,请执行以下命令:
adb shell setprop debug.firebase.analytics.app package_name
package_name 替换为包名
科学上网哈!!! 在 firebase 后台中 分析 下的 DebugView 中选择你的调试设备,在时间线上可以看到大约1分钟左右延迟的事件信息。算是非常好用。
关闭调试:
adb shell setprop debug.firebase.analytics.app .none.
以上为 Event 一个大概的使用方法,下面分享下我在开发中是如何使用 Firebase Event
项目中使用 Event
定义工具类
object Track {
// 创建 FirebaseAnalytics 对象
private val firebaseAnalytics: FirebaseAnalytics by lazy { Firebase.analytics }
// 做一个监听,可以在上报事件到 firebase 时,也上报到自己服务器
private var trackListener: TrackListener? = null
fun setTrackListener(trackListener: TrackListener) {
Track.trackListener = trackListener
}
// 初始化 firebase 信息,只设置了默认参数,默认参数值为设备信息
fun initTrack(user_id: String = "") {
val channel = BuildConfig.BUILD_TYPE
val country = LanguageUtils.getSystemLanguage().country
val language = LanguageUtils.getSystemLanguage().language
val deviceId = DeviceUtils.getAndroidID()
val oSVersion = DeviceUtils.getSDKVersionName()
val oSModel = DeviceUtils.getModel()
val abi = DeviceUtils.getABIs().joinToString(";")
val timeZone = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
TimeZone.getDefault().id + ""
} else ""
val network = NetworkUtils.getNetworkType().name
val carrierName = EncodeUtils.urlEncode(NetworkUtils.getNetworkOperatorName(), "UTF-8").toString()
val deviceInfo = "$channel,$country,$language,$deviceId,$oSVersion,$oSModel,$abi,$timeZone,$network,$carrierName"
Track.setDefaultEventParameters(Bundle().apply {
putString(Track.DefaultParam.DEVICE_INFO, deviceInfo)
if (user_id.isNotEmpty()) {
putString(Track.Param.USER_ID, user_id)
}
})
}
fun logEvent(event: String) {
logEvent(event, null)
}
// 最终会调用 logEvent,上报 Firebase 和 自己的监听事件
fun logEvent(event: String, bundle: Bundle? = null) {
if (BuildConfig.DEBUG)
Log.d("TrackFA", "event = $event, bundle = $bundle")
trackListener?.track(event, bundle)
firebaseAnalytics.logEvent(event, bundle)
}
// 设置用户 id
fun setUserId(userId: String) {
firebaseAnalytics.setUserId(userId)
}
// 设置用户属性
fun setUserProperty(name: String?, value: String?) {
name ?: return
if (name.isEmpty()) return
firebaseAnalytics.setUserProperty(name, value)
}
// 设置事件的默认参数
fun setDefaultEventParameters(bundle: Bundle) {
firebaseAnalytics.setDefaultEventParameters(bundle)
}
// 所有业务事件定义
object Event {
const val LOGIN_CLICK = "login_click" // 登陆页点击登录
}
// 所有开发事件定义 由开发者定义,但是要考虑 500 种事件限制!!!
object DevEvent {
const val DEV_HTTP_RESP = "dev_http_resp" //http请求结果 异常
}
// 所有时间参数的 名称
object Param {
const val USER_ID = "user_id"
const val PHONE = "phone"
}
// 所有默认参数的 名称
object DefaultParam {
const val DEVICE_INFO = "device_info" // Channel,Country,Language,DeviceId,OSVersion,OSModel,TimeZone,Network,CarrierName
}
// 所有需要记录用户属性名称
object UserProperty {
const val USER_ID = "user_id"
const val AGE = "age"
const val BIRTHDAY = "birthday"
const val COUNTRY_NAME = "country_name"
const val GENDER = "gender"
}
interface TrackListener {
fun track(event: String, bundle: Bundle?)
}
}
初始设置 Firebase 公共参数时机
- Application 中,(建议,但是如果未登录状态下,登录后需要再设置下公共参数,目的把登录相关公共参数赋值)
- 登录后
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Track.initTrack()
}
}
这里是 demo 所以随意在 Activity 中设置了。
设置 用户属性 时机
- 登录后,或者是拥有用户属性信息后
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Track.initTrack()
findViewById<Button>(R.id.btn_login).setOnClickListener {
Track.logEvent(Track.Event.LOGIN_CLICK)
// 登录成功
Track.setUserProperty("name", "Dany")
}
}
}
setUserId
时机
- 登录后,或者是拥有用户属性信息后
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Track.initTrack()
findViewById<Button>(R.id.btn_login).setOnClickListener {
Track.logEvent(Track.Event.LOGIN_CLICK)
// 登录成功
Track.setUserProperty("name", "Dany")
Track.setUserId("uid123456")
}
}
}
setTrackListener
时机
- 记录事件之前
避免丢失事件
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Track.initTrack()
Track.setTrackListener(object : Track.TrackListener {
override fun track(event: String, bundle: Bundle?) {
// 上报服务器
}
})
findViewById<Button>(R.id.btn_login).setOnClickListener {
Track.logEvent(Track.Event.LOGIN_CLICK)
// 登录成功
Track.setUserProperty("name", "Dany")
Track.setUserId("uid123456")
}
}
}
logEvent
时机
一般记录事件为动作发生和结束,比如点击登录按钮,登录成功和登录失败。 我比较强烈建议的,在接口请求失败或者报错后也上报 firebase 和 自己服务器后台日志,方便出问题时查找问题原因(减少斯比。毕竟日志铁证如山!!!)
初次接入后,使用 logEvent,Firebase 后台中不会立马收集到 首次上报的 Event,需要在24小时左右之后再来看才会显示在 Event 列表中!!!
限制
- Event 最多 500 种