使用不显示的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 }