Android Jetpack 之 Lifecycle

本文详细解读Android Jetpack的Lifecycle组件,介绍其如何帮助开发者管理Activity和Fragment的生命周期,通过接入方式、自定义LifecycleOwner和观察者机制来提升代码可维护性。了解如何在应用中使用Lifecycle避免样板代码和一致性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Jetpack 之 Lifecycle

参考文章:“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握!
参考文章:谷歌Lifecycle文档

0 Jetpack
  • 遵循最佳做法,Android Jetpack 组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。
  • 消除样板代码,Android Jetpack 可以管理各种繁琐的 Activity(如后台任务、导航和生命周期管理),以便您可以专注于打造出色的应用。
  • 减少不一致,这些库可在各种 Android 版本和设备中以一致的方式运作,助您降低复杂性。
1 简介

Lifecycle提供了可用于构建生命周期感知型组件的类和接口,用于帮助开发者管理Activity和Fragment 的生命周期

2 接入

AndroidX中build.gradle中添加依赖:

implementation 'androidx.appcompat:appcompat:1.2.0'
3 使用方法

Lifecycle的使用很简单:

  1. 先实现生命周期观察者LifecycleObserver接口,方法上使用OnLifecycleEvent注解关注对应生命周期,生命周期触发时就会执行对应方法。
  2. 生命周期拥有者使用getLifecycle()获取Lifecycle实例,然后代用addObserve()添加观察者

第一步代码如下:

//让各个组件存储自己的逻辑可使 Activity 和 Fragment 逻辑更易于管理。
class MyObserver : LifecycleObserver {
    private val TAG = "Lifecycle_Test"

    @OnLifecycleEvent(value = Lifecycle.Event.ON_RESUME)
    fun connect() {
        Log.i(TAG, "connect: ")
    }

    @OnLifecycleEvent(value = Lifecycle.Event.ON_PAUSE)
    fun disConnect() {
        Log.i(TAG, "disConnect: ")
    }
}

第二步代码如下:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        //注册生命周期观察者
        lifecycle.addObserver(MyObserver())
    }
}
4 LifecycleOwner

实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件完美配合,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。

public interface LifecycleOwner {
    /**
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

AndroidX在这Activity 、Fragment 中默认实现了 LifecycleOwner 接口,并在中 getLifecycle()方法返回的是LifecycleRegistry注册的对象Lifecycle。

自定义LifecycleOwner
class MyActivity : Activity(), LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }

    public override fun onStart() {
        super.onStart()
        lifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
}

MyActivity实现LifecycleOwner,getLifecycle()返回lifecycleRegistry实例。lifecycleRegistry实例则是在onCreate创建,并且在各个生命周期内调用markState()方法完成生命周期事件的传递。这就完成了LifecycleOwner的自定义,也即MyActivity变成了LifecycleOwner,然后就可以和 实现了LifecycleObserver的组件配合使用了。

5 Application生命周期 ProcessLifecycleOwner

管理整个应用进程的生命周期可以用ProcessLifecycleOwner,最常见用于判断App处于前后台。

使用ProcessLifecycleOwner需要先添加依赖:
implementation “androidx.lifecycle:lifecycle-process:2.2.0”

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        //注册App生命周期观察者
        ProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationLifecycleObserver())
    }

    /**
     * Application生命周期观察,提供整个应用进程的生命周期
     *
     * Lifecycle.Event.ON_CREATE只会分发一次,Lifecycle.Event.ON_DESTROY不会被分发。
     *
     * 第一个Activity进入时,ProcessLifecycleOwner将分派Lifecycle.Event.ON_START, Lifecycle.Event.ON_RESUME。
     * 而Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_STOP,将在最后一个Activit退出后后延迟分发。如果由于配置更改而销毁并重新创建活动,则此延迟足以保证ProcessLifecycleOwner不会发送任何事件。
     *
     * 作用:监听应用程序进入前台或后台
     */
    private class ApplicationLifecycleObserver : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        private fun onAppForeground() {
            Log.d("Lifecycle_process", "ApplicationObserver: app moved to foreground")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        private fun onAppBackground() {
            Log.d("Lifecycle_process", "ApplicationObserver: app moved to background")
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值