一起Talk Android吧(第三百八十八回:lifecycle)

本文介绍了Jetpack库中的Lifecycle组件,解释了如何使用Lifecycle监听Activity和Fragment的生命周期。通过代码示例展示了添加依赖、创建Lifecycle对象及将其添加到Activity或Fragment中的过程。

各位看官们,大家好,上一回中咱们说的是LiveData的例子,这一回中咱们介绍的例子是lifecycle。闲话休提,言归正转,让我们一起Talk Android吧!

概念介绍

看官们,Lifecycle是Jetpack库中的一部分,它主要用来监听Activity和Fragment的生命周期,官方文档中称其为生命周期感知组件,其实我们在前面章回中介绍过的ViewModelLiveData也是生命周期感知组件。

有看官提问:Activity的生命周期回调函数(onCreate等)机制就能感知到Activity的生命周期呀,为什么还要使用Lifecycle去感知Activity的生命周期?回答是:它可以把生命周期相关的逻辑从Activity中分离出来,让Activity专注于业务功能,这样有助于代码解耦。

Lifecycle对Activity生命周期和感知以事件的形式体现出来,比如Activity为Created状态时Lifecycle的监听事件为ON_CREATE,Activity的每个状态在Lifecycle中都有对应的监听事件,其对应关系如下图所示:(这是官方文档中的截图)

在这里插入图片描述

使用方法

明白Lifecycle的概念后我们介绍它的使用方法,还是使用文字结合代码的风格来介绍。

1.添加依赖

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

2.创建Lifecycle对象

首先自定义一个类,实现LifecycleEventObserver接口,并且重写接口中的onStateChanged()方法,具体代码如下:

public class LifecycleObserverEx implements LifecycleEventObserver {
    private static final String TAG="LifeObservEx";

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        Log.d(TAG, "onStateChanged: state: "+event.toString());
    }
}

在上面的代码中,自定义类重写了接口中的onStateChanged()方法,通过该方法的第二参数获取到被监听对象(Activity/Fragment)的生命周期,与生命周期对应的是ON_XXX等事件,我们在程序中通过Log输出了Lifecycle监听到的事件,大家可以自动动手来观察。

创建Lifecycle对象还有另外一种方法:实现DefaultLifecycleObserver接口,具体的代码如下:

public class LifecycleObserverEx implements DefaultLifecycleObserver {
    private static final String TAG="LifeObservEx";
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onCreate(owner);
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStart(owner);
        Log.d(TAG, "onStart: ");
    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onResume(owner);
        Log.d(TAG, "onResume: ");
    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onPause(owner);
        Log.d(TAG, "onPause: ");
    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStop(owner);
        Log.d(TAG, "onStop: ");
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onDestroy(owner);
        Log.d(TAG, "onDestroy: ");
    }

}

这种方法中Lifecycle监听到的生命周期状态不再是ON_XXX事件,而是和Activity中onXXX回调方法一样的回调方法。这个方法相信大家都很熟悉。我们不再详细介绍,大家可以自动手去实践,如果可以打印出代码中的log,说明Lifecycle已经监听到Activity的生命周期状态了。

3.添加Lifecycle对象到Activity或者Fragment中

使用Lifecycle类的addObserver()方法把步骤2中创建的Lifecycle对象添加到Activity/Fragment中,通常是在onCreate()方法中添加,详细代码如下:

getLifecycle().addObserver(new LifecycleObserverEx());

代码中通过getLifecycle()方法可以获取到Lifecycle类型的对象,这个操作大家可能不理解,其实可以把Activity或者Fragment当作是Lifecycle对象,具体的原因我们可以通过下面的继承树看出来

androidx.activity.ComponentActivity implements LifecycleOwner(getLifecycle()是此接口中的方法)androidx.fragment.app.FragmentActivityandroidx.appcompat.app.AppCompatActivity
   ↳ xxxActivity

看官们,关于Android中让lifecycle的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

### 兼容性注意事项 升级 Android Gradle 插件(AGP)到 8.0 时,需特别注意 `androidx.lifecycle` 模块的依赖兼容性问题。AGP 8.0 引入了多项与 JDK 11 和 Java 17 的兼容性改进,这可能影响到 `lifecycle-viewmodel-ktx`、`lifecycle-livedata-ktx` 和 `lifecycle-common-java8` 等模块的使用。 #### lifecycle-viewmodel-ktx `lifecycle-viewmodel-ktx` 是一个专为 Kotlin 语言设计的库,提供了 `ViewModel` 的扩展功能。在 AGP 8.0 中,确保使用 `lifecycle-viewmodel-ktx:2.6.1` 或更高版本。该版本已适配 AGP 8.0,并支持 Kotlin 1.8 或更高版本。若项目中使用了较旧版本的 `ViewModel`,需要检查其与 AGP 8.0 的兼容性[^1]。 #### lifecycle-livedata-ktx `lifecycle-livedata-ktx` 同样是专为 Kotlin 设计的库,提供了对 `LiveData` 的语法扩展。在 AGP 8.0 中,确保使用 `lifecycle-livedata-ktx:2.6.1` 或更高版本。此版本已适配 AGP 8.0,并支持 Kotlin 1.8 或更高版本。此外,AGP 8.0 对 Kotlin DSL 的支持有所增强,确保 `build.gradle.kts` 文件中的依赖声明正确无误[^2]。 #### lifecycle-common-java8 `lifecycle-common-java8` 是基于 Java 8 的注解处理器,用于支持 `DefaultLifecycleObserver` 等接口的自动绑定。在 AGP 8.0 中,建议使用 `androidx.lifecycle:lifecycle-compiler:2.6.1` 替代 `lifecycle-common-java8`。这是因为 `lifecycle-compiler` 更好地支持 JDK 11 和 Java 17,避免因类文件中包含 `MODULE` 属性而导致的解析错误。若继续使用 `lifecycle-common-java8`,需确保项目中使用的 JDK 版本为 Java 8,以避免注解处理器无法识别 `MODULE` 属性的问题[^1]。 #### Gradle 配置 在升级 AGP 到 8.0 时,需调整 `build.gradle` 文件中的配置,以确保兼容性。以下是一个典型的配置示例: ```groovy android { namespace 'com.example.myapp' compileSdk 34 defaultConfig { applicationId "com.example.myapp" minSdk 21 targetSdk 34 versionCode 1 versionName "1.0" } compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = '11' } } ``` 确保 `sourceCompatibility` 和 `targetCompatibility` 设置为 Java 11,并将 `kotlinOptions` 中的 `jvmTarget` 设置为 `11`。这样可以确保项目在 AGP 8.0 下正确编译和运行[^1]。 #### 依赖管理 在 AGP 8.0 中,建议使用最新的 `lifecycle` 依赖版本,以确保兼容性和功能完整性。以下是一个典型的依赖配置示例: ```groovy dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1" annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.6.1" } ``` 通过使用 `annotationProcessor` 替代 `kapt`,可以避免因 Kotlin 注解处理器不兼容而导致的问题。此外,确保所有依赖版本一致,以避免潜在的冲突[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值