自定义控件 监控宿主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在一个应 ...
随机推荐
- redis--主从复制(读写分离)
应用程序对服务器大量的读写,服务器很可能会宕机,导致数据丢失.为了解决这一问题就有了主从复制. 作用: 1:防止数据丢失 2:提高系统的吞吐量 主从复制:从服务器复制主服务器中的数据. 读写分离:应用 ...
- CodeForces - 686D 【树的重心】
传送门:http://codeforces.com/problemset/problem/686/D 题意:给你n个节点,其中1为根, 第二行给你2~n的节点的父亲节点编号. 然后是q个询问,求询问的 ...
- hook键盘钩子_非dll
unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...
- 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL
在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...
- SQLServer多条件查询技巧
2019-10-15 13:31:04 在实际项目开发中,有很多页面都会出现多条件查询功能,类似于这种情况: 牵扯到数据就少不了数据库了.这么多条件的查询,如果要用常规的if else来写判断逻辑的 ...
- kafka分区选主机制
Kafka Partition Leader选主机制 https://blog.csdn.net/qq_27384769/article/details/80115392 kafka leader选举 ...
- alert(1&&2)的输出问题
此文章转载自http://blog.csdn.net/xiaotao_css/article/details/61940664 一.先来说说 ||(逻辑或),从字面上来说,只有前后都是false的时候 ...
- nginx_tcp_proxy代理酸酸乳
一.安装低版本的nginx(高版本不支持tcp代理模块:nginx_tcp_proxy_module)Nginx默认只支持http反向代理,要支持tcp反向代理,需在编译时增加tcp代理模块[ngin ...
- 深入分析Java反射(四)-动态代理
动态代理的简介 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分 ...
- 云托管,边缘物理计算&托管物理计算,你所需要了解的……
随着业务发展,传统数据中心建设复杂性越来越高,基建的管理.设备的繁杂.人力成本的提升,是否让你的运维成本越来越高?企业生产效率却越来越低? 业务快速发展,设备采购周期冗长,大量采购造成CAPEX过重, ...