LifeCycle的作用是感知组件(Activity/Fragment)的生命周期 , 并在合适的生命周期执行分配的任务.
假设我们此时有一个Util类,其中有两个方法需要分别在Activity的onStart和onDestory的时候执行,我们可以先让它实现LifecycleObserver:
class LifecycleUtil : LifecycleObserver {
@OnLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_START)
fun startFun() {
}
@OnLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_STOP)
fun stopFun() {
}
}
然后对于任何实现了LifecycleOwner
接口的生命周期组件,如果需要使用该Util的话,只需要添加如下一行代码即可。
lifecycle.addObserver(LocationUtil( ))
class MyActivity : AppCompatActivity(), LifecycleOwner {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
lifecycle.addObserver(LifecycleUtil())
}
}
LifeCycle
让LifecycleUtil
这种第三方组件在自己的内部就可以拿到生命周期,这样原来需要写在Activity/Fragment
中内部逻辑处理,在组件内部就可以独立完成,进一步解耦.
如果此时需要将LifecycleUtil
的两个方法放到其他生命周期去执行,也只需改一下注解就好了,外部无需任何修改.
一些App都有在应用切换到后台时弹出一个toast,提示你正在后台运行,用Lifecycle实现很简单,同样是使用Lifecycle.Event
的ON_Start
和ON_STOP.
然后在应用启动时 , 在ContentProvider或Application中调用如下代码:
ProcessLifecycleOwner.get().lifecycle.addObserver(LifecycleUtil())
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(LifecycleUtil())
}
}
ProcessLifecycleOwner
可以感知整个进程的生命周期,监控应用的前后台切换轻而易举.
使用ProcessLifecycleOwner可能需要在build.grade里添加依赖:
implementation "android.arch.lifecycle:extensions:1.1.1"
或者
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-rc03'
我们经常会有这样的功能,面试官也会问这样的问题,想关闭所有Activity应该怎么做?
利用Application.ActivityLifecycleCallbacks
有全新的方式来实现了.
class MyActivityLifeCycleCallBack : Application.ActivityLifecycleCallbacks {
companion object {
val instance = MyActivityLifeCycleCallBack()
}
private val activityList: ArrayList<Activity> = ArrayList()
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activityList.add(activity)
println("onActivityCreated : ${activity.localClassName}")
}
override fun onActivityStarted(activity: Activity) {
println("onActivityStarted : ${activity.localClassName}")
}
override fun onActivityResumed(activity: Activity) {
println("onActivityResumed : ${activity.localClassName}")
}
override fun onActivityPaused(activity: Activity) {
println("onActivityPaused : ${activity.localClassName}")
}
override fun onActivityDestroyed(activity: Activity) {
println("onActivityDestroyed : ${activity.localClassName}")
activityList.remove(activity)
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
}
override fun onActivityStopped(activity: Activity) {
println("onActivityStopped : ${activity.localClassName}")
}
fun clearAllActivity() {
for (activity: Activity in activityList) {
activity.finish()
}
}
}
通过Application.ActivityLifecycleCallbacks
可以监听到所有Activity的生命周期,只要在Application中
注册这个Callback
就行了.
registerActivityLifecycleCallbacks(MyActivityLifeCycleCallBack.instance)
此时每个Activity
的生命周期就都在我们的监控中了,如果我们想要实现关闭所有的Activity可以这样做:
在MyActivityLifecycleCallback
我们实现了一个clearAllActivity
的方法,很简单 , 并且将MyActivityLifecycleCallback
做为一个单例使用.
companion object {
val instance = MyActivityLifeCycleCallBack()
}
fun clearAllActivity() {
for (activity: Activity in activityList) {
activity.finish()
}
}
那么,在使用的时候直接调用这个方法就可以了:
Lifecycle可谓神器,让我们的代码可以写的更标准,更准确.
参考 :
硬核讲解 Jetpack 之 LifeCycle 使用篇