自定义控件 监控宿主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
        }
复制代码

 

posted @   荣超  阅读(514)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2018-07-18 RecyclerView notifyDataSetChanged无效问题
点击右上角即可分享
微信分享提示