1. 生命周期感知组件概述

1.1 什么是生命周期感知组件

生命周期感知组件(Lifecycle-aware Components)是 Android Architecture Components 的核心组成部分。它们能够自动感知 Activity、Fragment 或 Service 等组件的生命周期状态变化,并在合适的时机执行初始化、停止或清理操作,而无需手动管理生命周期回调。

核心思想:组件不再被迫监听回调,而是向 Lifecycle 对象注册观察者,由 Lifecycle 在状态变更时通知所有观察者。这从根本上解耦了界面逻辑与非界面逻辑,降低了开发者遗漏释放资源或重复初始化的风险。

关键定义:生命周期感知组件 = 实现了 LifecycleObserver 接口并通过 @OnLifecycleEvent 或 DefaultLifecycleObserver 订阅 Lifecycle 事件的类。它的生命周期由关联的 LifecycleOwner(通常是 Activity/Fragment)驱动。

1.2 应用场景

以下场景非常适合替换成生命周期感知组件,否则极易导致内存泄漏或重复工作:

  • 位置更新:只在应用前台时请求位置,后台时停止。
  • 相机预览:在 Activity onStart 时打开摄像头,onStop 时释放。
  • 传感器监听:仅在屏幕可见时注册传感器监听器,不可见时注销。
  • 网络轮询:与界面生命周期同步开始/停止长连接。
  • 数据库观察:只在界面可见时更新 UI,避免无效刷新。
传统方式 vs 生命周期感知组件
场景传统手动管理生命周期感知方式
LocationManager.requestLocationUpdates()onResume 注册,onPause 注销,容易遗漏通过 LifecycleObserver 自动绑定
Camera.open() / release()onStart / onStop 手工配对@OnLifecycleEvent(Lifecycle.Event.ON_START) 自动触发
Handler 定时任务onDestroy 中 removeCallbacks,可能跳过Lifecycle-aware Handler 在 destroy 时自动清理

1.3 与 Android 组件的关联

生命周期感知组件并非独立存在,它们与 Android 四大组件(尤其是 Activity、Fragment)及 Application 通过 LifecycleOwner 接口建立关联:

  • Activity:ComponentActivity 默认实现 LifecycleOwner,内部维护 LifecycleRegistry。
  • Fragment:androidx.fragment.app.Fragment 同样实现 LifecycleOwner,其生命周期由宿主 Activity 及 FragmentManager 管理。
  • Service:可通过 LifecycleService 获得生命周期支持,但 Service 本身生命周期较简单。
  • Application:ProcessLifecycleOwner 提供整个应用前后台切换的状态感知。
注意:如果你使用 androidx.appcompat:appcompat 或 androidx.fragment:fragment,Activity/Fragment 自动就是 LifecycleOwner,无需额外配置。
生命周期感知组件关联架构 LifecycleOwner Activity Fragment LifecycleService Application Lifecycle 状态 + 事件分发 LifecycleObserver LocationTracker CameraManager SensorObserver NetworkListener LifecycleOwner 持有 Lifecycle 对象,Lifecycle 遍历所有注册的 LifecycleObserver 并在状态变化时自动触发对应注解/回调方法

1.4 基础代码示例:自定义生命周期感知组件

以下是一个最简单的 LocationTracker 组件,它会在 Activity onStart 时开始定位,onStop 时停止:

public class LocationTracker implements LifecycleObserver {
    private final Context context;

    public LocationTracker(Context context) {
        this.context = context;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void startTracking() {
        // 注册位置监听
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stopTracking() {
        // 注销位置监听
    }
}

在 Activity 中只需一行注册:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getLifecycle().addObserver(new LocationTracker(this));
    }
}
常见错误:开发者容易忘记在 addObserver 之前确保组件已经准备好,或者在不需要生命周期感知时过度使用。生命周期感知组件适用于需要与界面绑定且会消耗系统资源的操作,对于纯数据计算类组件,直接使用回调可能更简单。

1.5 与 Android 组件关联的细节

LifecycleOwner 实现类及对应生命周期映射
Android 组件LifecycleOwner 实例状态变更触发事件
ActivityComponentActivityonCreate → ON_CREATE, onStart → ON_START, onResume → ON_RESUME, onPause → ON_PAUSE, onStop → ON_STOP, onDestroy → ON_DESTROY
Fragmentandroidx.fragment.app.Fragment同 Activity,但额外有 ON_VIEW_CREATED 和 ON_VIEW_DESTROYED
ServiceLifecycleService (androidx.lifecycle.Service)onCreate → ON_CREATE, onDestroy → ON_DESTROY
ApplicationProcessLifecycleOwner前台/后台切换:ON_START/ON_STOP(全局)

通过这种设计,任何实现了 LifecycleObserver 的类都可以与 Activity 或 Fragment 的生命周期解耦,开发者只需要关注业务逻辑的编排,无需再手动处理生命周期回调的配对。这是 Lifecycle 感知组件设计的核心价值。