自定义控件 监控宿主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
}
自定义控件 监控宿主activity的生命周期的更多相关文章
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android Activity的生命周期
一.为什么要了解Activity的生命周期 activity is directly affected by its association withother activities, its tas ...
- Activity 之生命周期
Activity 之生命周期 本文内容: 1. Activity 介绍 2. Activity 的生命周期 2.1 生命周期图 2.2 常见情况下生命周期的回调 2.3 关于生命周期常见问题 2.4 ...
- 【Android】11.1 Activity的生命周期和管理
分类:C#.Android.VS2015: 创建日期:2016-02-21 一.基本概念 1.必须理解这些方法,否则你编的程序根本就没法在实际项目中使用 当然,如果仅仅是为了玩玩,或者仅仅是作为例子为 ...
- Android开发之Activity的生命周期以及加载模式
本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...
- Activity的生命周期
Activity的生命周期 以往我们实现页面间的跳转都是实例化Intent类的对象,但是页面在我们眼前的出现与消失没有我们所看到的那么简单,它有一个复杂的生命周期,一个页面的出现,被覆盖,再次出现,被 ...
- 浅谈Android中Activity的生命周期
引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...
- 每天一点Android干货-Activity的生命周期
Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...
随机推荐
- JS-语句五
for循环的实例 1.九九乘法表: 1*1 1*2 1*3 1*2 2*2 2*3 1*3 2*3 3*3 1*4 2*4 4*3 ...
- 「不会」Min25筛
大概的思路是把所有数分成质数和合数考虑 对于质数,必须找出一个很简单的完全积性函数和所求函数拟合 把所有数当做质数看待求个前缀和,然后再枚举合数的最小质因子把合数T掉 枚举到根号n,即可保证把n以内的 ...
- win10使用笔记本自带显卡GUP安装CUDA,版本问题
1.GPU算力问题 查询:win+r, GPU:GeForce GTX 850m,算力5.0,还可以跑得起来深度项目 2.我们需要查看NVIDIA驱动版本,才能安装合适的CUDA版本. 在C:\Pro ...
- MySQL--SHOW ENGINE INNODB STATUS
===================================== -- :: 0x7f305b965700 INNODB MONITOR OUTPUT =================== ...
- Ubuntu18.04 有线无法正常上网(请读完全文再进行操作)
电脑Windows10+Ubuntu18.04双系统,一直都没问题,前段时间突然在Ubuntu系统下有线连接失败,但是在Windows下可以正常上网. 今天尝试进行了修复. 在终端通过ifconfig ...
- Linux(CENTOS7) Redis安装
1.下载redis 在disk目录下,输入以下命令进行下载: wget http://download.redis.io/releases/redis-2.8.3.tar.gz 2.解 ...
- 吴裕雄--天生自然Linux操作系统:Linux 安装
Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果直接不想搭建,也可以直接买一台学习用用,参考各大云服务器比较:https://www.runoob.com/linux/ ...
- java生成6位数所有组合
for(int i=0;i<=9;i++){ String str=""; str=str+i; String strj=""; for(int j=0; ...
- python计算网络借贷和分期的年利率
一.现金分期年利率 现在很多人都有使用网上借贷,动不动就消费分期.经过了解很多对贷款利率有一些误解,粗看觉得产生的利息也不是很高,但是年化利率到第是多少,这里面的玩法是怎样的呢. 拿某个借贷平台举例, ...
- 求素数的一个快速算法 Python 快速输出素数算法
思想 以100以内为例. 生成一个全是True的101大小的数组 2开始,遇到2的倍数(4,6,8,10...)都赋值为False 因为这些数字都有因子 2 3开始,遇到3的倍数(6,9,12...) ...