【绝非标题党】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)
相关推荐
GY-935 分钟前
【Android】Android Studio 中的协程
android
Geek-Chow7 分钟前
移动 App 侧载攻击:Android 与 iOS 的信任链、突破口与防护
android
Android小码家1 小时前
framework&framework-minus-apex&android.jar的区别
android·python·jar
技术风向解码者1 小时前
安卓跨端选型:为什么优先看 Kuikly
android
科小怪1 小时前
大肥鱼桌宠下载(2026最新版):在安卓桌面上养一条会走会弹会碎碎念的胖鱼
android
qq3621967051 小时前
安卓安装包完整性校验:怎么确认下载的 APK 没被动过手脚
android
FLJwu2 小时前
《运动相机硬件防护选型实战》专栏|第二篇(PPTC 自恢复保险丝)
android·经验分享·数码相机·1024程序员节·运动相机
驰骋工作流12 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程14 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽17 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app