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,避免无效刷新。
| 场景 | 传统手动管理 | 生命周期感知方式 |
|---|---|---|
| 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,无需额外配置。
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 组件关联的细节
| Android 组件 | LifecycleOwner 实例 | 状态变更触发事件 |
|---|---|---|
| Activity | ComponentActivity | onCreate → ON_CREATE, onStart → ON_START, onResume → ON_RESUME, onPause → ON_PAUSE, onStop → ON_STOP, onDestroy → ON_DESTROY |
| Fragment | androidx.fragment.app.Fragment | 同 Activity,但额外有 ON_VIEW_CREATED 和 ON_VIEW_DESTROYED |
| Service | LifecycleService (androidx.lifecycle.Service) | onCreate → ON_CREATE, onDestroy → ON_DESTROY |
| Application | ProcessLifecycleOwner | 前台/后台切换:ON_START/ON_STOP(全局) |
通过这种设计,任何实现了 LifecycleObserver 的类都可以与 Activity 或 Fragment 的生命周期解耦,开发者只需要关注业务逻辑的编排,无需再手动处理生命周期回调的配对。这是 Lifecycle 感知组件设计的核心价值。