前にこういう記事を書いてデバッグを加速させました。
【Android】Activityを開いたらLogcatにそのActivityへのリンクを表示する - アプリ開発備忘録
よく考えるとFragmentでもできるんじゃないか?と思い調べてみたらできました。
使用する機能
FragmentManager
に registerFragmentLifecycleCallbacks
という関数があります。
これを使用することでFragmentのResumeイベントが取得できます。ActivityのonCreateは以前の記事にもあるように ActivityLifecycleCallbacks
で取得できますので、onActivityCreated
で FragmentLifecycleCallbacks
を登録してあげます。
コード
自分は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)" } }