アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

【Android】Fragmentを開いたらLogcatにそのFragmentへのコードリンクを表示する

前にこういう記事を書いてデバッグを加速させました。
【Android】Activityを開いたらLogcatにそのActivityへのリンクを表示する - アプリ開発備忘録

よく考えるとFragmentでもできるんじゃないか?と思い調べてみたらできました。

使用する機能

FragmentManagerregisterFragmentLifecycleCallbacks という関数があります。

これを使用することでFragmentのResumeイベントが取得できます。ActivityのonCreateは以前の記事にもあるように ActivityLifecycleCallbacks で取得できますので、onActivityCreatedFragmentLifecycleCallbacks を登録してあげます。

コード

自分はhyperionを使用しているため、FragmentにhyperionのFragmentも入ってきてしまうため、それを除外しています。

registerFragmentLifecycleCallbacks の第二引数をtrueにすることでネストしたFragmentにも登録することができます。

import android.app.Activity
import android.app.Application
import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import kotlin.reflect.KClass
import kotlin.reflect.jvm.jvmName

class DebugPrintLifecycleCallbacks : Application.ActivityLifecycleCallbacks {
    companion object {
        private const val TAG = "NowResumedUIClass"
        private const val HyperionNamespace = "com.willowtreeapps.hyperion"
    }

    override fun onActivityPaused(activity: Activity) {}
    override fun onActivityStarted(activity: Activity) {}
    override fun onActivityDestroyed(activity: Activity) {}
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
    override fun onActivityStopped(activity: Activity) {}

    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        if (activity is AppCompatActivity) {
            activity.supportFragmentManager.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
                override fun onFragmentResumed(fm: FragmentManager, fragment: Fragment) {
                    if (fragment::class.jvmName.startsWith(HyperionNamespace).not()) {
                        Log.d(TAG, getFileLinkString(fragment::class, "onResumeFragment"))
                    }
                }
            }, true)
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                activity.fragmentManager.registerFragmentLifecycleCallbacks(object : android.app.FragmentManager.FragmentLifecycleCallbacks() {
                    override fun onFragmentResumed(
                            fm: android.app.FragmentManager?,
                            fragment: android.app.Fragment?
                    ) {
                        fragment ?: return
                        if (fragment::class.jvmName.startsWith(HyperionNamespace).not()) {
                            Log.d(TAG, getFileLinkString(fragment::class, "onResumeFragment"))
                        }
                    }
                }, true)
            }
        }
    }

    override fun onActivityResumed(activity: Activity) {
        Log.d(TAG, getFileLinkString(activity::class, "onResumeActivity"))
    }

    private fun getFileLinkString(clazz: KClass<*>, tag: String): String {
        return "\t$tag\n\tat ${clazz.jvmName}.init(${clazz.simpleName}:1)"
    }
}