lifecyle简介
lifecyle作用:监听Activity与Fragment的生命周期。
lifeCycle是基于观察者使用的,把actiivity和fragment设计成被观察者,自己写的类就是观察者,一旦activity或者fragment生命周期发生变化,就会发通知给观察者,观察者会鉴别这些通知,不同的通知会调用不同的API。
不用lifeCycle如何监听生命周期
package com.example.test_23_0422_lifecyle_livedata
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
lateinit var iMain:IMain
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
iMain = MyView()
iMain.onCreate()
}
override fun onStart() {
super.onStart()
iMain.onStart()
}
override fun onResume() {
super.onResume()
iMain.onResume()
}
override fun onPause() {
super.onPause()
iMain.onPause()
}
override fun onStop() {
super.onStop()
iMain.onStop()
}
override fun onDestroy() {
super.onDestroy()
iMain.onDestroy()
}
}
package com.example.test_23_0422_lifecyle_livedata
import android.util.Log
class MyView : IMain{
override fun onCreate() {
Log.i("zhang_xin","onCreate方法执行了")
}
override fun onStart() {
Log.i("zhang_xin","onStart方法执行了")
}
override fun onResume() {
Log.i("zhang_xin","onResume方法执行了")
}
override fun onPause() {
Log.i("zhang_xin","onPause方法执行了")
}
override fun onStop() {
Log.i("zhang_xin","onStop方法执行了")
}
override fun onDestroy() {
Log.i("zhang_xin","onDestroy方法执行了")
}
}
运行打印输出
---------------------------- PROCESS STARTED (29135) for package com.example.test_23_0422_lifecyle_livedata ----------------------------
2023-04-22 10:34:57.707 29135-29135 zhang_xin com...est_23_0422_lifecyle_livedata I onCreate方法执行了
2023-04-22 10:34:57.716 29135-29135 zhang_xin com...est_23_0422_lifecyle_livedata I onStart方法执行了
2023-04-22 10:34:57.722 29135-29135 zhang_xin com...est_23_0422_lifecyle_livedata I onResume方法执行了
2023-04-22 10:35:08.445 29135-29135 zhang_xin com...est_23_0422_lifecyle_livedata I onPause方法执行了
2023-04-22 10:35:09.088 29135-29135 zhang_xin com...est_23_0422_lifecyle_livedata I onStop方法执行了
2023-04-22 10:35:09.095 29135-29135 zhang_xin com...est_23_0422_lifecyle_livedata I onDestroy方法执行了
缺点:iMain这个引用会和Activity绑定在一起,容易造成内存泄漏。另外如果需要监听其他的Activity,我们还要在多个地方写这种代码。耦合性很强,不容易管理。
lifeCycle如何使用
activity或者fragment实现LifecycleOwner(系统已经帮我们实现好),这样,activity和fragment就成了被观察者,我们自己的类需要实现LifecycleObserver,这样,我们自己写的类就变成了观察者。通过 getLifecycle.addObserver(MyView())完成观察者对被观察者的订阅。
看代码
package com.example.test_23_0422_lifecyle_livedata
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(MyView())
}
override fun onStart() {
super.onStart()
}
override fun onResume() {
super.onResume()
}
override fun onPause() {
super.onPause()
}
override fun onStop() {
super.onStop()
}
override fun onDestroy() {
super.onDestroy()
}
}
package com.example.test_23_0422_lifecyle_livedata
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
class MyView : LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(owner: LifecycleOwner) {//onCreate()方法名随便写,主要是注解
Log.i("zhang_xin","onCreate方法执行了 ${owner.javaClass.name}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(owner: LifecycleOwner) {
Log.i("zhang_xin","onStart方法执行了 ${owner.javaClass.name}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(owner: LifecycleOwner) {
Log.i("zhang_xin","onResume方法执行了 ${owner.javaClass.name}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onPause(owner: LifecycleOwner) {
Log.i("zhang_xin","onPause方法执行了 ${owner.javaClass.name}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(owner: LifecycleOwner) {
Log.i("zhang_xin","onStop方法执行了 ${owner.javaClass.name}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(owner: LifecycleOwner) {
Log.i("zhang_xin","onDestroy方法执行了 ${owner.javaClass.name}")
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onAny(owner: LifecycleOwner) {
Log.i("zhang_xin","onAny方法执行了 ${owner.javaClass.name}")
}
}
打印输出
---------------------------- PROCESS STARTED (31341) for package com.example.test_23_0422_lifecyle_livedata ----------------------------
2023-04-22 11:00:39.605 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onCreate方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:00:39.605 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onAny方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:00:39.608 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onStart方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:00:39.608 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onAny方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:00:39.614 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onPause方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:00:39.614 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onResume方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:00:39.614 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onAny方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:01:19.512 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onAny方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:01:20.137 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onStop方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:01:20.137 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onAny方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:01:20.142 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onDestroy方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
2023-04-22 11:01:20.142 31341-31341 zhang_xin com...est_23_0422_lifecyle_livedata I onAny方法执行了 com.example.test_23_0422_lifecyle_livedata.MainActivity
一般建议写一个base类,然后各个方法空实现,需要绑定生命周期的类可以集成该base类