android jetpack第二篇:Lifecycle原理和使用方式

引言:android的jetpack中有一个非常重要的组件,几乎是jetpack组件的灵魂,它提供了一种低耦合的生命周期监听方案,这就是LifeCycle。在介绍LifeCycle之前,我们有必要了解什么是生命周期。
jetpack上的明珠

一、android组件的生命周期及其意义

activity生命周期

上图以activity的生命周期为例,其告知开发者activity组件当前的状态,是处于前台还是后台,是创建还是销毁。那么开发者为什么要知道这些呢? 最最重要的就是在不同的时机加载资源或者销毁资源,所以能够监听生命周期的LifeCycle就显得至关重要了,正如那王冠上的明珠一般。

二、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开发技巧,希望大家关注并能有所帮助。

  • 42
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Jetpack是一组用于Android应用程序开发的库集合,旨在帮助开发者简化开发流程、提高生产力和应用性能。它提供了一些常用的组件和工具,可以帮助开发者解决常见的开发问题。 要使用Android Jetpack,您需要在您的项目中添加相关的Jetpack库依赖。您可以通过在项目的build.gradle文件中添加相应的依赖来实现。例如,要使用Navigation组件,您可以添加以下依赖: implementation "androidx.navigation:navigation-fragment-ktx:2.3.5" implementation "androidx.navigation:navigation-ui-ktx:2.3.5" 一旦您添加了所需的依赖,您可以开始使用Jetpack组件了。对于Navigation组件,您可以使用Navigation图形化界面来创建和管理应用程序中的导航结构,并使用NavController来处理导航操作。 另外,为了更好地理解和学习Android Jetpack,您可以借助官方文档和示例代码来深入学习。官方文档提供了详细的介绍和用法示例,而示例代码可以帮助您更好地理解如何在实际项目中应用Jetpack组件。 总结起来,要使用Android Jetpack,您需要添加相关的库依赖,并根据具体的组件使用文档进行配置和使用。通过深入学习官方文档和示例代码,您可以更好地理解和掌握Jetpack的使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android Jetpack架构开发,从入门到实战,看这一篇就够了](https://blog.csdn.net/Eqiqi/article/details/127534594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Android JetPack学习](https://blog.csdn.net/weixin_39069034/article/details/100170739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值