【绝非标题党】Lifecycle的原理及使用,看这篇就够了

一、Lifecycle 的核心作用

Jetpack Lifecycle 是 Android 架构组件中用于感知和管理生命周期 的核心工具,它通过观察者模式将 Activity/Fragment 的生命周期事件解耦到独立组件中。传统开发模式需要在 Activity 中直接调用业务组件的生命周期方法,导致代码臃肿且难以维护,而 Lifecycle 通过以下机制解决这个问题:

  • 生命周期拥有者(LifecycleOwner):Activity/Fragment 实现该接口,成为生命周期事件源
  • 生命周期观察者(LifecycleObserver):业务组件实现该接口,接收生命周期事件
  • 事件分发机制:自动将生命周期事件传递给已注册的观察者

二、核心源码解析

1. 事件分发机制

1.1 原理

LifeCycle作为大部分jetpack组件库的基石,有理由要掌握其原理及其灵活使用。 原理感觉很简单.

  1. 实现LifecycleOwner接口
  2. 在生命周期回调方法中,调用handleLifecycleEvent(event)转交给LifeCycleRegistry
  3. LifecycleRegistry支持addObserver()方法,并取出所有的观察者回调给上层。

1.2 事件分发流程

java 复制代码
// ReportFragment 示例
@Override 
public void onStart() {
    super.onStart();
    dispatch(Lifecycle.Event.ON_START);
}

private void dispatch(Lifecycle.Event event) {
    Activity activity = getActivity();
    if (activity instanceof LifecycleOwner) {
        LifecycleRegistry registry = ((LifecycleOwner) activity).getLifecycle();
        registry.handleLifecycleEvent(event); // 核心分发方法
    }
}

2. LifecycleRegistry 工作原理

2.1 观察者管理

java 复制代码
public class LifecycleRegistry extends Lifecycle {
    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = 
        new FastSafeIterableMap<>();

    public void addObserver(@NonNull LifecycleObserver observer) {
        // 将观察者包装为 ObserverWithState
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        mObserverMap.putIfAbsent(observer, statefulObserver);
    }
}
  • 使用 FastSafeIterableMap 维护观察者列表
  • ObserverWithState 封装观察者及其当前状态

2.2 状态同步算法

java 复制代码
void sync() {
    while (!isSynced()) {
        // 计算目标状态
        State targetState = calculateTargetState();
        // 通过事件触发状态迁移
        moveToState(targetState);
    }
}
  • 通过 State 的枚举值(CREATED/STARTED/RESUMED 等)管理生命周期阶段
  • 事件(Event)驱动状态迁移,例如:ON_START 事件将状态从 CREATED 迁移到 STARTED

3. 状态与事件关系

当前状态 触发事件 新状态
INITIALIZED ON_CREATE CREATED
CREATED ON_START STARTED
STARTED ON_RESUME RESUMED
RESUMED ON_PAUSE STARTED
STARTED ON_STOP CREATED
CREATED ON_DESTROY DESTROYED

三、使用实践

1. 基本使用方式

1.1 实现观察者(三选一)

kotlin 复制代码
// 方式1:注解式(即将废弃)
class MyObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connect() { /* 连接资源 */ }
}

// 方式2:接口式(推荐)
class MyObserver : DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) { /* 连接资源 */ }
}

// 方式3:统一事件处理
class MyObserver : LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when(event) {
            Lifecycle.Event.ON_RESUME -> { /* 连接资源 */ }
            Lifecycle.Event.ON_PAUSE -> { /* 释放资源 */ }
        }
    }
}

1.2 注册观察者

kotlin 复制代码
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(MyObserver()) // 自动绑定生命周期
    }
}

2. 高级用法

2.1 状态查询

kotlin 复制代码
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
    // 安全执行需要 Activity 可见的操作
}

2.2 自定义 LifecycleOwner

java 复制代码
public class MyService extends Service implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public void onCreate() {
        super.onCreate();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}

四、设计优势

  1. 解耦性:业务组件不再需要持有 Activity/Fragment 引用
  2. 内存安全:弱引用防止内存泄漏
  3. 状态一致性:保证观察者状态与宿主同步
  4. 扩展性:支持自定义 LifecycleOwner(如 Service)
相关推荐
z***677723 分钟前
SpringBoot(7)-Swagger
android·前端·后端
apigfly1 小时前
如何通过 Android 消息机制实现 Looper 的性能监控
android·性能优化·app
雨白2 小时前
Jetpack Compose 实战:复刻 Material 3 圆形波浪进度条
android·android jetpack
q***23923 小时前
MySQL JSON数据类型全解析(JSON datatype and functions)
android·mysql·json
weixin_446260854 小时前
Windows 安装原生安卓 App!无需模拟器,秒装谷歌商店!
android
fruge4 小时前
移动端 H5 兼容问题合集:iOS 与 Android 的差异化处理
android·ios
2501_915909064 小时前
iOS 上架需要什么东西?一次从准备清单到实操流程的完整技术拆解
android·macos·ios·小程序·uni-app·cocoa·iphone
成都大菠萝6 小时前
Android层级分布
android
用户69371750013846 小时前
8.Kotlin 类:类的基础:主构造函数与次构造函数
android·后端·kotlin
用户69371750013846 小时前
9.Kotlin 类:类的核心:属性 (Property) 与自定义访问器 (Getter/Setter)
android·后端·kotlin