Android LifeCycle监控生命周期

831 阅读2分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

LifeCycle的作用是感知组件(Activity/Fragment)的生命周期 , 并在合适的生命周期执行分配的任务.

1.监听组件生命后期

假设我们此时有一个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())
    }
}

LifeCycleLifecycleUtil 这种第三方组件在自己的内部就可以拿到生命周期,这样原来需要写在Activity/Fragment中内部逻辑处理,在组件内部就可以独立完成,进一步解耦.

如果此时需要将LifecycleUtil的两个方法放到其他生命周期去执行,也只需改一下注解就好了,外部无需任何修改.

2.监听应用前后台切换

一些App都有在应用切换到后台时弹出一个toast,提示你正在后台运行,用Lifecycle实现很简单,同样是使用Lifecycle.EventON_StartON_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'

3.全局管理Activity

我们经常会有这样的功能,面试官也会问这样的问题,想关闭所有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 使用篇