前言 上一篇文章Android Jetpack架构组件(一)了解Android Jetpack中我们简单介绍了Jetpack组件,从本篇开始逐步的介绍Jetpack组件中的Architecture部分,本篇从Lifecycle开始。
没有Lifecycle
的时候如何管理声明周期?
-
一般情況下,我们可以直接写一个接口
LifecycleListener
,在Activity的生命周期中对应的调用这个接口的方法,就可以实现我们的代码逻辑,代码如下所示:class DetailActivity : AppCompatActivity() { lateinit var listener: LifecycleListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_app_detail) listener = LifecycleListener() } override fun onStart() { super.onStart() Log.i("aaa", "Activity onStart ") listener.onStart() } override fun onStop() { super.onStop() Log.i("aaa", "Activity onStop ") listener.onStop() } } class LifecycleListener { fun onStart() { Log.i("aaa", "listener onStart ") } fun onStop() { Log.i("aaa", "listener onStop ") } ... } //运行结果 aaa: Activity onStart aaa: listener onStart aaa: Activity onStop aaa: listener onStop
-
其实这可以理解为一个观察者模式,Activity就是被观察者,它持有LifecycleListener这个观察者,当生命周期发生变化的时候,会调用观察者
LifecycleListener
对应的方法来执行我们需要的逻辑,但是这样写有几个问题。 -
首先,因为在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。
-
此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。
如何使用Lifecycle
?
- 有了以上的问题,这时候我们就需要使用Lifecycle组件了。
- Lifecycle是一个声明周期感知型组件,生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中。另外这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。
- 想要使用Lifecycle组件首先要加上依赖,因为gradle的依赖会有依赖传递效果,所以我们不用全部加上所有的依赖,当然加上也没有关系。
dependencies { implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.lifecycleVersion"//记得替换为实际的版本 }
- 我们将上面的代码使用Lifecycle组件先以注解形式重新来写,代码如下:
我们看到首先在注解2处自定义了一个类class DetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_app_detail) lifecycle.addObserver(LifecycleListener()) //--- 1 ---- } override fun onStart() { super.onStart() Log.i("aaa", "Activity onStart ") } override fun onStop() { super.onStop() Log.i("aaa", "Activity onStop ") } } class LifecycleListener : LifecycleObserver { // //--- 2 ---- @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onStart() { Log.i("aaa", "listener onStart ") } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onStop() { Log.i("aaa", "listener onStop ") } } //结果如下 aaa: Activity onStart aaa: listener onStart aaa: listener onStop aaa: Activity onStop
LifecycleListener
实现了Lifecycle的组件LifecycleObserver
,里面的方法使用了注解@OnLifecycleEvent
, 然后在注解1的地方直接调用lifecycle.addObserver
将我们自定义的LifecycleListener传进去
就可以了,本篇只讲解Lifecycle的使用,下一篇我会讲解原理,所以这里知道怎么使用就可以了。 - 上面使用的是注解的方式,如果我们使用的是java8, 我们也可以采用另外一种非注解的方式实现,首先要加上依赖:
dependencies { implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" //记得替换为实际的版本 }
- 加上了这个依赖后,里面只有一个类就是
DefaultLifecycleObserver
, 源码如下:public interface DefaultLifecycleObserver extends FullLifecycleObserver { @Override default void onCreate(@NonNull LifecycleOwner owner) { } @Override default void onStart(@NonNull LifecycleOwner owner) { } @Override default void onResume(@NonNull LifecycleOwner owner) { } @Override default void onPause(@NonNull LifecycleOwner owner) { } @Override default void onStop(@NonNull LifecycleOwner owner) { } @Override default void onDestroy(@NonNull LifecycleOwner owner) { } }
DefaultLifecycleObserver
虽然是一个接口,但是默认实现了最常见的生命周期方法,我们可以自定义一个类实现DefaultLifecycleObserver
, 然后只重写我们需要的代码即可,所以整个代码如下:class DetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_app_detail) lifecycle.addObserver(LifecycleListener()) } override fun onStart() { super.onStart() Log.i("aaa", "Activity onStart ") } override fun onStop() { super.onStop() Log.i("aaa", "Activity onStop ") } class LifecycleListener : DefaultLifecycleObserver { override fun onStart(owner: LifecycleOwner) { super.onStart(owner) Log.i("aaa", "listener onStart ") } override fun onStop(owner: LifecycleOwner) { super.onStop(owner) Log.i("aaa", "listener onStop ") } } } //结果如下 aaa: Activity onStart aaa: listener onStart aaa: listener onStop aaa: Activity onStop
- 真实的开发环境中,我们可以将
LifecycleListener
放在一个单例中,这样Activity中就不会有这个类了,Activity的代码就会变的更加简洁。
总结
本片主要讲解的是如何使用Lifecycle组件,在下一篇Lifecycle原理篇中我们会对本篇中的代码结合源码部分进行深入讲解。