• 自定义控件 监控宿主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
            }
  • 相关阅读:
    Centos启动Cassandra交互模式失败:No appropriate python interpreter found
    删除Kafka的topic
    《面向中国资本市场应用的分布式总账白皮书》笔记
    搭建Kafka集群(3-broker)
    【转】矩阵求导计算规则
    二次型求导
    解决: org.iq80.leveldb.DBException: IO error: C:data rie00945.sst: Could not create random access file.
    SSH遇见的问题
    解决:Redis:java.util.NoSuchElementException: Unable to validate object at
    【转】mysql查询结果输出到文件
  • 原文地址:https://www.cnblogs.com/rchao/p/11208649.html
Copyright © 2020-2023  润新知