一、引言
在 Android 开发中,管理组件(如 Activity、Fragment)的生命周期是一项复杂且重要的任务。当组件的生命周期发生变化时,我们可能需要执行一些相应的操作,例如在组件销毁时释放资源,或者在组件启动时开始某些任务。Jetpack Lifecycles 库为开发者提供了一种便捷的方式来处理组件的生命周期,使得代码更加简洁、可维护,并且能够有效避免内存泄漏等问题。
二、Lifecycles 基本概念
2.1 Lifecycle
Lifecycle 是一个抽象类,它代表了一个组件(如 Activity 或 Fragment)的生命周期状态和事件。它包含两个主要的枚举类型:
Lifecycle.State:表示组件的当前生命周期状态,包括INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED等。Lifecycle.Event:表示生命周期状态变化时触发的事件,如ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY等。
2.2 LifecycleOwner
LifecycleOwner 是一个接口,任何实现了该接口的类都可以提供一个 Lifecycle 对象。在 Android 中,AppCompatActivity 和 Fragment 都已经实现了 LifecycleOwner 接口,因此它们可以直接提供自己的 Lifecycle 对象。
2.3 LifecycleObserver
LifecycleObserver 是一个接口,用于定义监听 Lifecycle 事件的观察者。通过在观察者类中定义带有特定注解的方法,可以在相应的生命周期事件发生时执行相应的操作。
三、Lifecycles 的基本使用
3.1 添加依赖
要使用 Lifecycles 库,需要在项目的 build.gradle 文件中添加以下依赖:
groovy
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
3.2 创建 LifecycleObserver
创建一个实现 LifecycleObserver 接口的类,并在类中定义带有特定注解的方法来处理生命周期事件。以下是一个简单的示例:
kotlin
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
class MyLifecycleObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
// 在组件创建时执行的操作
println("onCreate called")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
// 在组件启动时执行的操作
println("onStart called")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
// 在组件恢复时执行的操作
println("onResume called")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
// 在组件暂停时执行的操作
println("onPause called")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
// 在组件停止时执行的操作
println("onStop called")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
// 在组件销毁时执行的操作
println("onDestroy called")
}
}
3.3 在 Activity 或 Fragment 中使用 LifecycleObserver
在 Activity 或 Fragment 中获取 Lifecycle 对象,并将 LifecycleObserver 注册到该 Lifecycle 上。以下是在 Activity 中使用的示例:
kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 创建 LifecycleObserver 实例
val observer = MyLifecycleObserver()
// 获取 Lifecycle 对象并注册观察者
lifecycle.addObserver(observer)
}
}
当 MainActivity 的生命周期发生变化时,MyLifecycleObserver 中的相应方法会被调用。
3.4 使用 Lifecycle 进行资源管理
Lifecycles 可以帮助我们更好地管理资源,例如在组件销毁时释放资源。以下是一个使用 Lifecycle 管理 MediaPlayer 资源的示例:
kotlin
import android.content.Context
import android.media.MediaPlayer
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
class MediaPlayerManager(private val context: Context, private val lifecycle: Lifecycle) : LifecycleObserver {
private var mediaPlayer: MediaPlayer? = null
init {
// 注册观察者
lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun startPlaying() {
mediaPlayer = MediaPlayer.create(context, R.raw.sample_audio)
mediaPlayer?.start()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stopPlaying() {
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
}
}
在 MainActivity 中使用 MediaPlayerManager:
kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 创建 MediaPlayerManager 实例
val mediaPlayerManager = MediaPlayerManager(this, lifecycle)
}
}
这样,MediaPlayer 会在 Activity 启动时开始播放音频,并在 Activity 停止时释放资源,避免了资源泄漏。
四、Lifecycles 源码原理解析
4.1 LifecycleRegistry
LifecycleRegistry 是 Lifecycle 的具体实现类,它负责管理 Lifecycle 的状态和事件,并通知注册的观察者。以下是 LifecycleRegistry 的主要工作流程:
状态管理
LifecycleRegistry 内部使用一个 State 变量来表示当前的生命周期状态,并提供了方法来更新状态:
kotlin
private State mState;
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
private void moveToState(State next) {
if (mState == next) {
return;
}
mState = next;
if (mHandlingEvent || mAddingObserverCounter != 0) {
mNewEventOccurred = true;
// 等待当前事件处理完成或观察者添加完成后再处理新事件
return;
}
mHandlingEvent = true;
sync();
mHandlingEvent = false;
}
handleLifecycleEvent() 方法用于处理生命周期事件,根据事件类型计算出下一个状态,并调用 moveToState() 方法更新状态。
观察者管理
LifecycleRegistry 内部使用一个 Map 来存储注册的观察者,并在状态变化时通知它们:
kotlin
private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
new FastSafeIterableMap<>();
public void addObserver(@NonNull LifecycleObserver observer) {
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
if (previous != null) {
return;
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
// 避免在 LifecycleOwner 已经销毁时添加观察者
return;
}
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
popParentState();
// 确保状态更新正确
targetState = calculateTargetState(observer);
}
if (!isReentrance) {
// 同步状态
sync();
}
mAddingObserverCounter--;
}
private void sync() {
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
+ "garbage collected. It is too late to change lifecycle state.");
}
while (!isSynced()) {
mNewEventOccurred = false;
// 当前状态小于最新状态,需要向上同步
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);
}
Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
// 当前状态大于最新状态,需要向下同步
if (!mNewEventOccurred && newest != null
&& mState.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred = false;
}
addObserver() 方法用于注册观察者,将观察者包装成 ObserverWithState 对象并存储在 mObserverMap 中。在状态变化时,sync() 方法会确保所有观察者的状态与当前 Lifecycle 的状态同步。
4.2 LifecycleEventObserver 和 ReflectiveGenericLifecycleObserver
LifecycleEventObserver 是一个接口,用于直接处理生命周期事件。而 ReflectiveGenericLifecycleObserver 是一个实现了 LifecycleEventObserver 接口的类,它通过反射机制调用观察者类中带有 @OnLifecycleEvent 注解的方法。
kotlin
class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
private final Object mWrapped;
private final CallbackInfo mInfo;
ReflectiveGenericLifecycleObserver(Object wrapped) {
mWrapped = wrapped;
mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
}
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
mInfo.invokeCallbacks(source, event, mWrapped);
}
}
ReflectiveGenericLifecycleObserver 在构造函数中通过 ClassesInfoCache 获取观察者类的回调信息,并在 onStateChanged() 方法中调用相应的回调方法。
4.3 组件(Activity、Fragment)与 Lifecycle 的集成
在 Android 中,AppCompatActivity 和 Fragment 等组件已经集成了 Lifecycle。以 AppCompatActivity 为例,它在内部维护了一个 LifecycleRegistry 对象,并在生命周期方法中调用 LifecycleRegistry 的 handleLifecycleEvent() 方法来更新 Lifecycle 的状态:
kotlin
public class AppCompatActivity extends FragmentActivity implements AppCompatCallback {
private final LifecycleRegistry mFragmentLifecycleRegistry = new LifecycleRegistry(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
@Override
protected void onStart() {
super.onStart();
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
@Override
protected void onResume() {
super.onResume();
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}
@Override
protected void onPause() {
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
super.onPause();
}
@Override
protected void onStop() {
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
super.onStop();
}
@Override
protected void onDestroy() {
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
super.onDestroy();
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mFragmentLifecycleRegistry;
}
}
这样,当 AppCompatActivity 的生命周期发生变化时,LifecycleRegistry 的状态也会相应更新,并通知注册的观察者。
五、总结
Jetpack Lifecycles 库为 Android 开发者提供了一种强大而便捷的方式来管理组件的生命周期。通过使用 Lifecycle、LifecycleOwner 和 LifecycleObserver,我们可以将生命周期相关的逻辑从组件中分离出来,使代码更加简洁、可维护。LifecycleRegistry 作为 Lifecycle 的具体实现,负责管理状态和事件,并通知观察者。在实际开发中,合理使用 Lifecycles 可以有效避免内存泄漏等问题,提高应用的稳定性和性能。