自定义控件 监控宿主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 }
分类:
android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2018-07-18 RecyclerView notifyDataSetChanged无效问题