自定义控件 监控宿主activity的生命周期

使用不显示的fragment来监控activity生命周期,fragment生命周期基本上跟随宿主activity变化。我们通过fragment的生命周期就可以知到activity的生命周期

我们自定义的控件持有这个fragment就可以利用接口监控其生命周期

我这里是在自定义视频播放器的时候使用的 就用到了onResume,onPause,onDestroy   处理退到后台暂停播放 返回前台恢复播放或者暂停  activity 销毁时清理播放器

下面我们先定义监控生命周期的接口LifeListener

interface LifeListener {

    fun onStart()

    fun onResume()

    fun onPause()

    fun onStop()

    fun onDestroy()

}

定义我们需要持有的lifeFragment

class LifeFragment: Fragment() {

    private var lifeListener: LifeListener? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    fun addLifeListener(listener: LifeListener) {
        this.lifeListener = listener
    }

    fun removeLifeListener() {
        lifeListener = null
    }


    override fun onStart() {
        super.onStart()
        lifeListener?.onStart()
    }

    override fun onStop() {
        super.onStop()
        lifeListener?.onStop()
    }

    override fun onResume() {
        super.onResume()
        lifeListener?.onResume()
    }

    override fun onPause() {
        super.onPause()
        lifeListener?.onPause()
    }

    override fun onDestroy() {
        super.onDestroy()
        lifeListener?.onDestroy()
    }
}

然后定义一个 LifeFragmentManager

class LifeFragmentManager {

    private var tag:String = this::class.java.name

    companion object{
        fun getInstances():LifeFragmentManager{
            return LifeFragmentManager()
        }
    }


    fun addLifeListener(activity: Activity?,tag:String?,lifeListener: LifeListener) {
        if(tag != null){
            this.tag = tag
        }
        if(activity != null){
            val fragment:LifeFragment? = getLifeListenerFragment(activity)
            fragment?.addLifeListener(lifeListener)
        }
    }

    private fun getLifeListenerFragment(activity: Activity):LifeFragment? {
        val manager: FragmentManager?
        when(activity){
            is AppCompatActivity -> manager = activity.supportFragmentManager
            is FragmentActivity -> manager = activity.supportFragmentManager
            else -> manager = null
        }
        if(manager == null) {
            Log.w(tag,"暂时仅支持获取FragmentActivity和AppCompatActivity的生命周期")
            return null
        }
        return getLifeListenerFragment(manager)
    }

    //添加空白fragment
    private fun getLifeListenerFragment(manager:FragmentManager):LifeFragment{
        var fragment:LifeFragment? = manager.findFragmentByTag(tag) as LifeFragment?
        if (fragment == null) {
            fragment = LifeFragment()
            manager.beginTransaction().add(fragment, tag).commitAllowingStateLoss()
        }
        return fragment
    }

}

最后在我们自定义控件初始化的时候调用

//tag fragment的标识 一般传入自定义控件类的类名称即可
LifeFragmentManager.getInstances().addLifeListener(scanForActivity(context), tag, mLifeListener)


private var mLifeListener = object : LifeListener {
        
        override fun onStart() {
            Log.d("======","onStart")
        }

        override fun onResume() {
            Log.d("======","onResume")
        }

        override fun onPause() {
            Log.d("======","onPause")
        }

        override fun onStop() {
            Log.d("======","onStop")
        }

        override fun onDestroy() {
            Log.d("======","onDestroy")
        }

    }
private fun scanForActivity(context: Context?): Activity? {
            if (context == null) return null
            if (context is Activity) {
                return context
            } else if (context is ContextWrapper) {
                return scanForActivity(context.baseContext)
            }
            return null
        }
原文地址:https://www.cnblogs.com/rchao/p/11208649.html