自定义控件 监控宿主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在一个应 ...
随机推荐
- CountUp.js 数字跳转效果小插件
CountUp.js 实现数字跳转效果的小插件 //调用方法 const easingFn = function (t, b, c, d) { var ts = (t /= d) * t; var ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL WHERE 子句
MySQL 表中使用 SQL SELECT 语句来读取数据. 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中. 语法 以下是 SQL SELECT 语句使用 WHERE ...
- java加解密算法--对称加密工作模式
对称加密又分为分组加密和序列密码.分组密码,也叫块加密(block cyphers),一次加密明文中的一个块.是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运 ...
- Android开发—错误记录1:W/System.err: java.net.ConnectException: Connection refused
W/System.err: java.net.ConnectException: Connection refused 前台访问后台时,出现访问被拒绝情况:W/System.err: java.net ...
- catalina.out日志膨胀问题解决实例,日志门面commons-logging的实践
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 笔者在公司的时候,遇到一个问题,2个模块A.B Tomcat中的catalina.out及catalina ...
- c# 之循环 ,while 和do---while还有for
㈠while循环 循环条件 是个bool值,为true时执行循环,为false退出循环.break一般不单独的使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就退出循环了. 循环体 一般总 ...
- Maven--导出pom中依赖的jar包
参考:https://my.oschina.net/cloudcoder/blog/212648 mvn dependency:copy-dependencies -DoutputDirectory= ...
- java 里没有友元函数怎么办
我希望一个service可以访问某个对象中的私有对象,但是不希望这个私有对象暴露给其它的service. public xxxServiceImpl{ public void do(){ xxxent ...
- GCC与gcc,g++区别
看的Linux公社的一篇文章,觉得不错,内容复制过来了. 其实在这之前,我一直以为gcc和g++是一个东西,只是有两个不同的名字而已,今天在linux下编译一个c代码时出现了错误才找了一下gcc和g+ ...
- Hard Disk Drive(MBR)
这里讲的主要是网上所谓的老式磁盘,它是由一个个盘片组成的,我们先从个盘片结构讲起.如图1所示,图中的一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之 ...