引言:android的jetpack中有一个非常重要的组件,几乎是jetpack组件的灵魂,它提供了一种低耦合的生命周期监听方案,这就是LifeCycle。在介绍LifeCycle之前,我们有必要了解什么是生命周期。
一、android组件的生命周期及其意义
上图以activity的生命周期为例,其告知开发者activity组件当前的状态,是处于前台还是后台,是创建还是销毁。那么开发者为什么要知道这些呢? 最最重要的就是在不同的时机加载资源或者销毁资源,所以能够监听生命周期的LifeCycle就显得至关重要了,正如那王冠上的明珠一般。
二、LifeCycle设计模式
上图精准地表达出了LifeCycle的设计方案。解读上图前先了解其中的几个概念:
LifeCycleOwner(宿主):提供生命周期的组件,往往是系统的activity、fragment或者application等。
LifeCycleRegistry:宿主生命周期的代理器,用于分发宿主的生命周期回调事件。
LifeCycleObserver:生命周期的监听器接口,可接听宿主生命周期变化。
DefaultLifecycleObserver和LifecycleEventObserver:带回调函数的监听器,继承自LifeCycleObserver。DefaultLifecycleObserver继承自FullLifecycleObserver接口。
通过上图容易发现LifeCycle的设计法案是:
宿主继承实现LifeCycleOwner供各组件监听其生命周期的变化,需要监听的组件需继承自LifeCycleObserver接口。当宿主生命周期变化时,通过代理类LifeCycleRegistry分发事件,最终监听者收到指定回调。
所以LifeCycle中至少用到三种设计模式(若对设计模式不太了解可以点击文字查看,设计模式对代码理解大有裨益):
1、监听者模式:通过LifeCycleOwner和LifeCycleObserver实现宿主和组件之间的解耦。
2、策略模式:宿主通过组合引入生命周期分发策略。
3、代理模式:宿主不直接分发生命周期回调到监听器,而是通过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的相同方法中。监听者关心哪个生命函数,便实现哪个,更加清晰一些。同样推荐使用。
四、小结
1、使用lifecycle方案监听生命周期时,宿主需实现LifetCycleOwner,所以我们的系统组件需是ComponentActivity的子类,androidx.fragment、LifecycleService、ProcessLifecycleOwner。
2、实现LifeCycleObserver后,需使用getLifecycle().addObserver()注册监听,无需取消注册。
3、lifecycle致力于生命周期的提供者和使用者解耦,采用了监听者模式的设计方案。在实际项目开发中,可学习jetpack和相关的设计模式,引入到项目中,提升代码质量。
至此lifecycle的基本原理和实现已介绍完,希望对大家有用。日后将持续更新android jetpack开发技巧,希望大家关注并能有所帮助。