自定义控件 监控宿主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在一个应 ...
随机推荐
- python数组定义
转自:https://blog.csdn.net/minsenwu/article/details/7872679 Python中没有数组的数据结构,但列表很像数组,如: a=[0,1,2],这时a[ ...
- openstack trove redis配置项
trove在mitaka版本更新了一个功能,configuration 具体如下: trove help |grep configuration configuration-attach Attach ...
- GPLT L3-021 神坛
在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...
- C基础 带你手写 redis ae 事件驱动模型
引言 - 整体认识 redis ae 事件驱动模型, 网上聊得很多. 但当你仔细看完一篇又一篇之后, 可能你看的很舒服, 但对于 作者为什么要这么写, 出发点, 好处, 缺点 ... 可能还是好模糊, ...
- web页面内容打印总结
web页面打印有两种,一种是直接调用window.print()命令操作,一种是使用ActiveX插件(Object标签)操作,但是第二种只支持IE内核的浏览器. 示例1: <!DOCTYPE ...
- ubuntu---【NVIDIA驱动 + CUDA 安装】不成功时的卸载方式
NVIDIA驱动 与 CUDA 安装不成功时,可以卸载,检查相关问题(配置.兼容性等),重新安装.这里记录一下,卸载方式.
- c++静态库和动态库的添加
# 声明要求的 cmake 最低版本cmake_minimum_required(VERSION 2.8)# 声明一个 cmake 工程project(helloSLAM) # 设置编译模式set( ...
- MySQL--基础SQL--DML
1.插入记录 INSERT INTO tablename (fields1, fields2, ..., fieldsn) VALUES (value1, value2, ..., valuen) 例 ...
- JavaScript—暂告,小节
Javastript 的学习告一段落了.虽然还有更多的:爬虫 什么的 但是和我在学校的相比 要扎实许多.知道了兼容性 面向对象,闭包.....一些细节的用法. 虽然以后可能很少用到.可是我觉得 ...
- JDBC(一)
1. JDBC介绍 JDBC(Java DataBase Connectivity),即Java数据库的连接.JDBC是一种用于执行SQL语句(DML,DDL,DQL)的Java API,可以为多 ...