Navigationコンポーネントを使い、アプリをSingle Activity構成にした際のアナリティクス(Firebase Analytics)のTipsを紹介します。
存在感の強い MainActivity
アナリティクスを使う場合、Activityは自動で計測されるため、特に意識せずとも画面遷移がトラッキングされ便利です。
https://firebase.google.com/docs/analytics/screenviews
しかしながら、自動計測はActivityのみのため、Navigationコンポーネントを使ったSingle Activity構成の場合に、そのままだと 存在感の強いMainActivity が出来上がってしまいます。
addOnDestinationChangedListener
を使うとシュッと対応できる💡
存在感の強いMainActivityを無くすために、各Fragmentにトラッキング用の仕組みを入れても良いかと思いますが、Navigationの画面遷移時に呼ばれる NavController#addOnDestinationChangedListener
を使うことでシュッと対応することができます。
サンプルコード
addOnDestinationChangedListener
を使ったサンプルコードです。
val navController: NavController = ...
navController.addOnDestinationChangedListener { _, destination, _ ->
// ① 型チェック
if (destination is FragmentNavigator.Destination) {
// ② Fragmentのクラス名を取得
val screenName = destination.className.split(".").last()
// ③ 送信
FirebaseAnalytics.getInstance(this).setCurrentScreen(this, screenName, screenName)
}
}
ポイントを解説します。
① 型チェック
addOnDestinationChangedListener
の destination
は型が NavDestination
となっており、そのままだとクラス名が取得できません。
そこで、 FragmentNavigator.Destination
かどうかをチェックし、スマートキャストでクラス名( className
)を取得できるようにします。
ちなみにNavigationでDialogFragmentを使っている場合はこれだと対応出来ないので、 DialogFragmentNavigator.Destination
かどうかのチェックも必要になりそうです。
② Fragmentのクラス名を取得
FragmentNavigator.Destination#className
は com.example.ExampleFragment
のようにパッケージ名も含んでいるため、 雑に split(".").last()
とすることでFragmentのクラス名だけを抽出しています。
③ 送信
②で抽出した screenName
を setCurrentScreen()
で送信します。
setCurrentScreen (Activity activity, String screenName, String screenClassOverride)
以上で、Single Activity構成時でも画面遷移時にいい感じにトラッキングができるようになりました。
まとめ
簡単ではありますが、Navigationコンポーネントを使い、アプリをSingle Activity構成にした際のアナリティクスのTipsを紹介しました。
addOnDestinationChangedListener
便利