使用不显示的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的生命周期的更多相关文章

  1. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  2. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  3. Android Activity的生命周期

    一.为什么要了解Activity的生命周期 activity is directly affected by its association withother activities, its tas ...

  4. Activity 之生命周期

    Activity 之生命周期 本文内容: 1. Activity 介绍 2. Activity 的生命周期 2.1 生命周期图 2.2 常见情况下生命周期的回调 2.3 关于生命周期常见问题 2.4 ...

  5. 【Android】11.1 Activity的生命周期和管理

    分类:C#.Android.VS2015: 创建日期:2016-02-21 一.基本概念 1.必须理解这些方法,否则你编的程序根本就没法在实际项目中使用 当然,如果仅仅是为了玩玩,或者仅仅是作为例子为 ...

  6. Android开发之Activity的生命周期以及加载模式

    本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...

  7. Activity的生命周期

    Activity的生命周期 以往我们实现页面间的跳转都是实例化Intent类的对象,但是页面在我们眼前的出现与消失没有我们所看到的那么简单,它有一个复杂的生命周期,一个页面的出现,被覆盖,再次出现,被 ...

  8. 浅谈Android中Activity的生命周期

    引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...

  9. 每天一点Android干货-Activity的生命周期

    Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...

随机推荐

  1. 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       ...

  2. 「不会」Min25筛

    大概的思路是把所有数分成质数和合数考虑 对于质数,必须找出一个很简单的完全积性函数和所求函数拟合 把所有数当做质数看待求个前缀和,然后再枚举合数的最小质因子把合数T掉 枚举到根号n,即可保证把n以内的 ...

  3. win10使用笔记本自带显卡GUP安装CUDA,版本问题

    1.GPU算力问题 查询:win+r, GPU:GeForce GTX 850m,算力5.0,还可以跑得起来深度项目 2.我们需要查看NVIDIA驱动版本,才能安装合适的CUDA版本. 在C:\Pro ...

  4. MySQL--SHOW ENGINE INNODB STATUS

    ===================================== -- :: 0x7f305b965700 INNODB MONITOR OUTPUT =================== ...

  5. Ubuntu18.04 有线无法正常上网(请读完全文再进行操作)

    电脑Windows10+Ubuntu18.04双系统,一直都没问题,前段时间突然在Ubuntu系统下有线连接失败,但是在Windows下可以正常上网. 今天尝试进行了修复. 在终端通过ifconfig ...

  6. Linux(CENTOS7) Redis安装

    1.下载redis         在disk目录下,输入以下命令进行下载: wget http://download.redis.io/releases/redis-2.8.3.tar.gz 2.解 ...

  7. 吴裕雄--天生自然Linux操作系统:Linux 安装

    Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果直接不想搭建,也可以直接买一台学习用用,参考各大云服务器比较:https://www.runoob.com/linux/ ...

  8. java生成6位数所有组合

    for(int i=0;i<=9;i++){ String str=""; str=str+i; String strj=""; for(int j=0; ...

  9. python计算网络借贷和分期的年利率

    一.现金分期年利率 现在很多人都有使用网上借贷,动不动就消费分期.经过了解很多对贷款利率有一些误解,粗看觉得产生的利息也不是很高,但是年化利率到第是多少,这里面的玩法是怎样的呢. 拿某个借贷平台举例, ...

  10. 求素数的一个快速算法 Python 快速输出素数算法

    思想 以100以内为例. 生成一个全是True的101大小的数组 2开始,遇到2的倍数(4,6,8,10...)都赋值为False 因为这些数字都有因子 2 3开始,遇到3的倍数(6,9,12...) ...