Android Jetpack之Lifecycle:原理与使用详解
Android Jetpack之Lifecycle:原理与使用详解
本文是Android Jetpack系列文章的第二篇,主要介绍Jetpack中的Lifecycle组件。Lifecycle是Jetpack中一个非常重要的组件,它提供了一种低耦合的生命周期监听方案,对于Android开发人员来说,理解和掌握Lifecycle的原理和使用方式至关重要。
一、Android组件的生命周期及其意义
上图以Activity的生命周期为例,展示了组件当前的状态,是处于前台还是后台,是创建还是销毁。了解这些信息对于开发者来说非常重要,因为这关系到在不同的时机加载资源或者销毁资源。因此,能够监听生命周期的Lifecycle就显得至关重要了。
二、Lifecycle设计模式
上图精准地表达出了Lifecycle的设计方案。解读上图前先了解其中的几个概念:
- LifecycleOwner(宿主):提供生命周期的组件,往往是系统的Activity、Fragment或者Application等。
- LifecycleRegistry:宿主生命周期的代理器,用于分发宿主的生命周期回调事件。
- LifecycleObserver:生命周期的监听器接口,可接听宿主生命周期变化。
- DefaultLifecycleObserver和LifecycleEventObserver:带回调函数的监听器,继承自LifecycleObserver。DefaultLifecycleObserver继承自FullLifecycleObserver接口。
通过上图容易发现Lifecycle的设计方案是:
宿主继承实现LifecycleOwner供各组件监听其生命周期的变化,需要监听的组件需继承自LifecycleObserver接口。当宿主生命周期变化时,通过代理类LifecycleRegistry分发事件,最终监听者收到指定回调。
所以Lifecycle中至少用到三种设计模式:
- 监听者模式:通过LifecycleOwner和LifecycleObserver实现宿主和组件之间的解耦。
- 策略模式:宿主通过组合引入生命周期分发策略。
- 代理模式:宿主不直接分发生命周期回调到监听器,而是通过LifecycleRegistry分发。
三、Lifecycle监听者的三种使用方式
通过第二部分的分析发现,系统已经帮我们实现了LifecycleOwner和LifecycleRegistry部分,即生命周期的提供者和生命周期分发逻辑。各业务在使用的过程中,只需要实现监听者部分LifecycleObserver的代码即可。
监听者接口共有三种形式,分别是LifecycleObserver、DefaultLifecycleObserver和LifecycleEventObserver,下面我们将分别实现这三种接口的监听。
1:LifecycleObserver实现监听
public class ScanObserver implements LifecycleObserver {
public ScanObserver(LifecycleOwner owner) {
owner.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void onResume() {
//获取相机,打开相机
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onStop() {
//释放相机
}
}
此方案可以实现监听,但是Android官方已不再推荐使用,OnLifecycleEvent也被标注废弃了。原因是此方法使用了注解,需要通过反射的方式通知到指定api,所以性能较差,不建议使用。
2:LifecycleEventObserver实现监听
public class ScanObserver implements LifecycleEventObserver {
public ScanObserver(LifecycleOwner owner) {
owner.getLifecycle().addObserver(this);
}
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
if (event == Lifecycle.Event.ON_RESUME) {
//打开相机
return;
}
if (event == Lifecycle.Event.ON_STOP) {
//释放相机资源
return;
}
}
}
此方案会将生命周期的事件封装成Event,通过onStateChanged回调给监听者,监听者在实现方法中处理不同生命周期事件。此方案效率高且无需继承太多的方法,推荐使用。
3:DefaultLifecycleObserver实现监听
public class ScanObserver implements DefaultLifecycleObserver {
public ScanObserver(LifecycleOwner owner) {
owner.getLifecycle().addObserver(this);
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
//获取相机资源
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
//释放相机资源
}
}
本方案和LifecycleEventObserver基本一致,只是此方法会将宿主的生命周期方法同步映射到DefaultLifecycleObserver的相同方法中。监听者关心哪个生命函数,便实现哪个,更加清晰一些。同样推荐使用。
四、小结
- 使用lifecycle方案监听生命周期时,宿主需实现LifetCycleOwner,所以我们的系统组件需是ComponentActivity的子类,androidx.fragment、LifecycleService、ProcessLifecycleOwner。
- 实现LifecycleObserver后,需使用getLifecycle().addObserver()注册监听,无需取消注册。
- lifecycle致力于生命周期的提供者和使用者解耦,采用了监听者模式的设计方案。在实际项目开发中,可学习jetpack和相关的设计模式,引入到项目中,提升代码质量。
至此lifecycle的基本原理和实现已介绍完,希望对大家有用。日后将持续更新android jetpack开发技巧,希望大家关注并能有所帮助。