Android-开源框架和源码分析-08-Lifecycle-源码解析

106 阅读10分钟

Lifecycle 的使用

在 Android 开发中,生命周期(Lifecycle)管理是非常重要的,尤其是在涉及到 UI 组件(如 ActivityFragment)时。Android 提供了 Lifecycle 库,帮助开发者简化生命周期管理,特别是避免常见的内存泄漏问题。Lifecycle 库主要包括 LiveDataViewModelLifecycleObserver 等组件。

下面是 Lifecycle 库的基本使用方法,帮助你更好地理解如何管理生命周期感知组件。


1. 基本概念

1.1 LifecycleOwner

LifecycleOwner 是一个接口,用来表示具有生命周期的组件,例如 ActivityFragmentViewModel

在 Android 中,ActivityFragment 都是 LifecycleOwner,它们提供了组件生命周期的状态(如 ON_CREATEON_START 等)。

kotlin
复制编辑
class MyActivity : AppCompatActivity(), LifecycleOwner {
    // Activity 实现 LifecycleOwner
}

1.2 LifecycleObserver

LifecycleObserver 是一个接口,用于响应生命周期状态的变化。你可以通过它来观察生命周期事件,执行与生命周期相关的操作。

kotlin
复制编辑
class MyLifecycleObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart() {
        // Activity 或 Fragment 进入 ON_START 状态时调用
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop() {
        // Activity 或 Fragment 进入 ON_STOP 状态时调用
    }
}

@OnLifecycleEvent 注解表示在生命周期的某个事件发生时,调用该方法。

1.3 LiveData

LiveData 是一个生命周期感知的数据容器。它允许我们观察数据的变化,并自动管理 UI 更新,确保仅在 UI 组件处于活跃状态时才通知观察者。

kotlin
复制编辑
val liveData = MutableLiveData<String>()

liveData.observe(this, Observer { data ->
    // 更新 UI
})

LiveData 会自动管理与生命周期相关的事件,只有当 ActivityFragment 处于活跃状态时,Observer 才会接收到数据的更新。


2. Lifecycle 库的常见使用场景

2.1 使用 ViewModel 和 LiveData 管理 UI 数据

ViewModel 是与 ActivityFragment 生命周期解耦的组件,适用于存储和管理 UI 相关的数据。ViewModel 通过 LiveData 将数据传递给 UI 层。即使在配置更改(如旋转屏幕)时,ViewModel 也能够保留数据,避免丢失。

步骤 1: 创建 ViewModel
kotlin
复制编辑
@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: MyRepository
) : ViewModel() {

    private val _data = MutableLiveData<String>()
    val data: LiveData<String> get() = _data

    fun loadData() {
        // 通过 repository 加载数据
        _data.value = repository.getData()
    }
}
  • @HiltViewModel:标记 ViewModel 让 Hilt 进行依赖注入。
  • LiveData:通过 LiveData 来观察数据变化,自动管理与生命周期相关的事件。
步骤 2: 在 ActivityFragment 中注入并观察数据
kotlin
复制编辑
@AndroidEntryPoint
class MyActivity : AppCompatActivity() {

    private val myViewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 观察 LiveData 数据变化
        myViewModel.data.observe(this, Observer { newData ->
            // 更新 UI
            textView.text = newData
        })

        // 加载数据
        myViewModel.loadData()
    }
}
  • viewModels() :用于简化 ViewModel 的创建和生命周期管理。
  • observe() :观察 LiveData 的变化并更新 UI。

2.2 使用 LifecycleObserver 响应生命周期变化

通过 LifecycleObserver,你可以在组件的生命周期内执行一些操作,比如在 onStart() 时开始任务,在 onStop() 时停止任务。

步骤 1: 创建 LifecycleObserver
kotlin
复制编辑
class MyLifecycleObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart() {
        // 组件进入 ON_START 状态时执行的操作
        Log.d("LifecycleObserver", "onStart triggered")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop() {
        // 组件进入 ON_STOP 状态时执行的操作
        Log.d("LifecycleObserver", "onStop triggered")
    }
}
步骤 2: 在 ActivityFragment 中注册 Observer
kotlin
复制编辑
class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 注册 LifecycleObserver
        lifecycle.addObserver(MyLifecycleObserver())
    }
}
  • lifecycle.addObserver() :在 ActivityFragment 中注册生命周期观察者,响应生命周期状态的变化。

2.3 在 ViewModel 中使用 SavedStateHandle 管理动态参数

在某些情况下,ViewModel 需要保存动态传入的参数。SavedStateHandle 是一种常见的解决方案,它允许你在配置变化时保存和恢复数据。

步骤 1: 创建带有 SavedStateHandle 的 ViewModel
kotlin
复制编辑
@HiltViewModel
class MyViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    fun getData(): String {
        // 获取动态传入的参数
        return savedStateHandle.get<String>("key") ?: "Default Value"
    }
}
步骤 2: 将动态数据传入 ViewModel
kotlin
复制编辑
val myViewModel: MyViewModel by viewModels()
val data = myViewModel.getData()
  • SavedStateHandle:用于在 ViewModel 中保存和恢复数据,特别是在配置变化时(如屏幕旋转)。

2.4 使用 Lifecycle 与 Service 的配合

Lifecycle 库还可以与 Service 一起使用,尤其是在需要在服务中管理任务的生命周期时。你可以通过 LifecycleObserver 来管理任务的启动和停止。

kotlin
复制编辑
class MyService : Service(), LifecycleObserver {

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

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStartCommand() {
        // 在服务的生命周期开始时启动任务
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStopCommand() {
        // 在服务的生命周期结束时停止任务
    }
}

3. 总结

Lifecycle 库通过与 LiveDataViewModelLifecycleObserver 的结合,使得 Android 开发者能够轻松管理组件的生命周期,响应生命周期变化。以下是 Lifecycle 库的一些常见用法:

  1. LiveData:一个生命周期感知的数据容器,可以确保数据仅在组件活跃时更新,避免不必要的 UI 更新。
  2. ViewModel:帮助在 ActivityFragment 生命周期期间保持数据,尤其在配置变化(如屏幕旋转)时非常有用。
  3. LifecycleObserver:让我们在组件的生命周期发生变化时执行操作,简化生命周期事件的处理。

通过使用 Lifecycle 库,开发者能够更加清晰和高效地管理 UI 数据和任务,避免常见的生命周期管理问题(如内存泄漏、无效的 UI 更新)。

Lifecycle 是 Android 提供的用于生命周期管理的核心库,目的是帮助开发者更好地管理 UI 组件的生命周期,避免内存泄漏并减少冗余的生命周期管理代码。Android 提供了 LifecycleLiveDataViewModel 等组件来简化生命周期相关的工作。下面将对 Lifecycle 库的源码进行解析,帮助理解它是如何工作的。

Lifecycle源码解析

1. Lifecycle 库架构概述

Lifecycle 库的主要作用是管理生命周期感知的组件,确保它们根据生命周期的变化来执行操作。它提供了以下主要组件:

  • Lifecycle:一个类,管理生命周期状态并通知观察者。
  • LifecycleOwner:生命周期所有者的接口,所有生命周期感知组件(如 ActivityFragment)都实现该接口。
  • LifecycleObserver:观察生命周期状态变化的接口,用于响应生命周期事件。
  • LiveData:一个生命周期感知的数据容器,确保数据只在组件处于活跃状态时更新。

2. Lifecycle 类源码解析

Lifecycle 类是 Lifecycle 库的核心,它用于追踪 LifecycleOwner 的生命周期状态,并向注册的观察者发送生命周期事件。

2.1 Lifecycle 类的声明

kotlin
复制编辑
public class Lifecycle {
    private final LiveData<State> mState;
    private final ArrayList<Observer> mObservers;

    // 生命周期状态
    public enum State {
        CREATED,
        STARTED,
        RESUMED,
        DESTROYED
    }

    // 生命周期事件
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY
    }

    public Lifecycle() {
        mState = new LiveData<>(State.CREATED);
        mObservers = new ArrayList<>();
    }

    // 获取当前生命周期状态
    public State getCurrentState() {
        return mState.getValue();
    }

    // 添加观察者
    public void addObserver(Observer observer) {
        mObservers.add(observer);
    }

    // 通知观察者生命周期变化
    private void notifyObservers(Event event) {
        for (Observer observer : mObservers) {
            observer.onStateChanged(event);
        }
    }
}
  • State:表示当前生命周期状态(如 CREATEDSTARTEDRESUMEDDESTROYED 等)。
  • Event:生命周期事件,用于通知观察者当前生命周期的变化(如 ON_CREATEON_STARTON_RESUME 等)。
  • LiveData<State>LiveData 用于保存和观察 StateLiveData 会在生命周期发生变化时更新值。
  • ArrayList<Observer> :存储所有注册的观察者。

2.2 addObserver() 方法

addObserver() 方法用于向 Lifecycle 添加一个生命周期观察者:

kotlin
复制编辑
public void addObserver(Observer observer) {
    mObservers.add(observer);
}
  • Observer 是一个接口,它包含 onStateChanged() 方法,用于在生命周期发生变化时接收通知。

2.3 notifyObservers() 方法

notifyObservers() 方法会在生命周期状态变化时通知所有注册的观察者:

kotlin
复制编辑
private void notifyObservers(Event event) {
    for (Observer observer : mObservers) {
        observer.onStateChanged(event);
    }
}
  • 这个方法会遍历所有的观察者并调用它们的 onStateChanged() 方法,将事件传递给它们。

3. LifecycleOwner 接口源码解析

LifecycleOwner 是一个接口,表示所有有生命周期的组件(如 ActivityFragment)。通过实现 LifecycleOwner 接口,组件可以与 Lifecycle 关联,并提供生命周期状态给 Lifecycle 管理。

3.1 LifecycleOwner 接口声明

kotlin
复制编辑
public interface LifecycleOwner {
    Lifecycle getLifecycle();
}
  • LifecycleOwner 接口提供了一个 getLifecycle() 方法,允许组件(如 ActivityFragment)访问其生命周期对象。Lifecycle 会追踪这些组件的生命周期状态并向观察者发出事件。

4. LifecycleObserver 接口和 @OnLifecycleEvent 注解

LifecycleObserver 是一个接口,用于响应生命周期事件。通过 @OnLifecycleEvent 注解,可以让方法响应特定的生命周期状态。

4.1 LifecycleObserver 接口声明

kotlin
复制编辑
public interface LifecycleObserver {
    // 用于响应生命周期变化的回调方法
}
  • LifecycleObserver 接口本身没有方法,实际上它通过带有 @OnLifecycleEvent 注解的方法来响应生命周期变化。

4.2 @OnLifecycleEvent 注解

@OnLifecycleEvent 注解用于标记一个方法,使其在生命周期事件发生时被调用。例如,ON_STARTON_STOP 事件。

kotlin
复制编辑
public class MyObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        // 在 ON_START 事件发生时调用
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        // 在 ON_STOP 事件发生时调用
    }
}
  • @OnLifecycleEvent(Lifecycle.Event.ON_START) 表示 onStart() 方法将在生命周期的 ON_START 事件发生时被调用。
  • @OnLifecycleEvent(Lifecycle.Event.ON_STOP) 表示 onStop() 方法将在生命周期的 ON_STOP 事件发生时被调用。

5. LiveData 类的源码解析

LiveData 是一个生命周期感知的数据容器,用于保存和观察数据的变化。它会根据 LifecycleOwner 的生命周期自动管理数据更新,确保 UI 组件只会在其生命周期处于活跃状态时接收数据更新。

5.1 LiveData 类声明

kotlin
复制编辑
public class LiveData<T> {
    private T mData;
    private List<Observer<? super T>> mObservers;

    public void observe(LifecycleOwner owner, Observer<? super T> observer) {
        // 注册观察者,观察数据变化
    }

    public void setValue(T value) {
        mData = value;
        notifyObservers();
    }
    
    private void notifyObservers() {
        for (Observer<? super T> observer : mObservers) {
            observer.onChanged(mData);
        }
    }
}
  • setValue() :用于更新 LiveData 中保存的数据,并通知所有观察者。
  • observe() :用于注册一个观察者,观察数据的变化。

LiveData 会根据 LifecycleOwner 的生命周期管理观察者。只有当 LifecycleOwner 处于活动状态时,LiveData 才会通知观察者更新数据。


6. LifecycleObserverLiveData 的协作

在 Android 的架构中,LifecycleObserverLiveData 经常一起使用,以确保数据的更新和 UI 的同步。例如,在 ActivityFragment 中,我们可以使用 LifecycleObserver 来响应生命周期事件,并在生命周期的合适时机使用 LiveData 更新 UI。

kotlin
复制编辑
class MyActivity : AppCompatActivity(), LifecycleObserver {

    private val myLiveData = MutableLiveData<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycle.addObserver(this)  // 注册生命周期观察者

        myLiveData.observe(this, Observer { newData ->
            // 更新 UI
        })
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart() {
        // 更新数据或执行其他操作
        myLiveData.value = "Data updated on ON_START"
    }
}
  • onStart() 方法中,我们通过 LiveData 更新数据,并将数据传递给 UI。
  • LiveData 会自动在生命周期有效时通知观察者更新 UI,避免在 Activity 被销毁时继续更新 UI,从而避免内存泄漏。

7. 总结

Lifecycle 库通过为 Android 提供生命周期感知的组件,帮助开发者更好地管理 UI 数据和响应生命周期变化。它的核心功能包括:

  • Lifecycle:管理生命周期状态并向观察者发送生命周期事件。
  • LifecycleOwner:实现该接口的组件提供生命周期状态。
  • LifecycleObserver:响应生命周期事件,执行与生命周期相关的操作。
  • LiveData:生命周期感知的数据容器,自动在组件生命周期内更新 UI。

通过这些组件,Android 开发者可以轻松管理组件的生命周期,响应生命周期事件,并简化常见的生命周期管理问题(如内存泄漏、UI 更新)。