目录
[一、为什么需要 Lifecycle?](#一、为什么需要 Lifecycle?)
[1.1 传统生命周期管理的问题](#1.1 传统生命周期管理的问题)
[1.2 Lifecycle 带来的解决方案](#1.2 Lifecycle 带来的解决方案)
[二、Lifecycle 核心组件:三位一体的架构](#二、Lifecycle 核心组件:三位一体的架构)
[2.1 LifecycleOwner:生命周期的拥有者](#2.1 LifecycleOwner:生命周期的拥有者)
[2.2 Lifecycle](#2.2 Lifecycle)
[2.3 LifecycleObserver](#2.3 LifecycleObserver)
[三、Lifecycle 的四种使用方式](#三、Lifecycle 的四种使用方式)
[3.1 方式一:实现 DefaultLifecycleObserver(推荐)](#3.1 方式一:实现 DefaultLifecycleObserver(推荐))
[3.2 方式二:使用注解(已废弃,但需要了解)](#3.2 方式二:使用注解(已废弃,但需要了解))
[3.3 方式三:实现 LifecycleEventObserver](#3.3 方式三:实现 LifecycleEventObserver)
[3.4 方式四:自定义 LifecycleObserver](#3.4 方式四:自定义 LifecycleObserver)
[四、Lifecycle 的高级特性详解](#四、Lifecycle 的高级特性详解)
[4.1 生命周期感知型组件:现代Android架构的核心](#4.1 生命周期感知型组件:现代Android架构的核心)
[4.2 生命周期状态判断:编写健壮的代码](#4.2 生命周期状态判断:编写健壮的代码)
[5.1 最佳实践](#5.1 最佳实践)
[5.2 常见问题及解决方案](#5.2 常见问题及解决方案)
[5.3 测试策略](#5.3 测试策略)
[📊 对比总结](#📊 对比总结)
一、为什么需要 Lifecycle?
1.1 传统生命周期管理的问题
在Android开发的世界里,生命周期管理一直是一个令人头疼的问题。每个Android开发者都曾经历过这样的场景:小心翼翼地在onCreate()中初始化组件,在onResume()中开始任务,然后在onPause()或onStop()中匆忙地进行清理。这种模式看似合理,实则隐藏着巨大的隐患。
想象一下这样的场景:你的应用有一个位置监听器,需要在界面可见时开始工作,在界面不可见时停止工作以节省电量。传统的做法是在Activity的onStart()和onStop()方法中分别调用位置监听器的启动和停止方法。这种方法看似简单,但随着业务逻辑的复杂化,问题会逐渐暴露出来。
当你在一个Activity中管理多个这样的组件时 ,代码会变得臃肿不堪。更糟糕的是,如果你忘记在合适的时机停止某个组件,可能会导致内存泄漏或电池快速耗尽。如果这个组件需要在多个Activity中使用,你不得不在每个Activity中重复相同的代码,这违反了DRY原则(不要重复自己)。
在 Lifecycle 出现之前,我们通常需要在 Activity/Fragment 中手动管理组件的生命周期:
java
public class MyLocationListener {
public void start() {
// 开始监听位置
}
public void stop() {
// 停止监听位置
}
}
// 在 Activity 中
@Override
protected void onStart() {
super.onStart();
myLocationListener.start();
}
@Override
protected void onStop() {
super.onStop();
myLocationListener.stop();
}
存在的问题:
-
代码分散,难以维护
-
容易遗漏清理操作
-
内存泄漏风险高
-
测试困难
1.2 Lifecycle 带来的解决方案
Lifecycle 通过观察者模式,让组件能够自主感知生命周期的变化。它提供了一种标准化的方式来管理组件的生命周期,让组件能够"感知"到生命周期的变化,并根据这些变化自动调整自己的行为。
二、Lifecycle 核心组件:三位一体的架构
2.1 LifecycleOwner:生命周期的拥有者
LifecycleOwner是一个接口,表示拥有生命周期的组件 。在Android中,最常见的LifecycleOwner就是Activity和Fragment。当你让一个类实现LifecycleOwner接口时,你实际上是在声明:"我是一个有生命周期的组件,其他组件可以观察我的生命周期变化。"
作用域:拥有生命周期的组件
css
// 内置实现
androidx.activity.ComponentActivity
androidx.fragment.app.Fragment
androidx.lifecycle.LifecycleService
注意:
- AppCompatActivity继承自ComponentActivity,天然支持Lifecycle
- 原生的android.app.Activity****不直接支持Lifecycle。
自定义 LifecycleOwner:
Java代码:
java
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
/**
* 自定义LifecycleOwner实现
* 让任何类都能拥有像Activity一样的生命周期管理能力
*/
public class CustomLifecycleOwner implements LifecycleOwner {
// 核心:LifecycleRegistry负责管理生命周期状态
private final LifecycleRegistry lifecycleRegistry;
/**
* 构造函数
*/
public CustomLifecycleOwner() {
// 初始化LifecycleRegistry,传入this表示当前对象是LifecycleOwner
this.lifecycleRegistry = new LifecycleRegistry(this);
// 设置初始状态为INITIALIZED
this.lifecycleRegistry.setCurrentState(Lifecycle.State.INITIALIZED);
}
/**
* 实现LifecycleOwner接口的唯一方法
* @return 返回生命周期对象
*/
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
/**
* 模拟Activity的onCreate方法
*/
public void onCreate() {
// 分发生命周期事件:ON_CREATE
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
System.out.println("CustomLifecycleOwner: ON_CREATE事件已分发");
}
/**
* 模拟Activity的onStart方法
*/
public void onStart() {
// 分发生命周期事件:ON_START
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
System.out.println("CustomLifecycleOwner: ON_START事件已分发");
}
/**
* 模拟Activity的onResume方法
*/
public void onResume() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
System.out.println("CustomLifecycleOwner: ON_RESUME事件已分发");
}
/**
* 模拟Activity的onPause方法
*/
public void onPause() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
System.out.println("CustomLifecycleOwner: ON_PAUSE事件已分发");
}
/**
* 模拟Activity的onStop方法
*/
public void onStop() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
System.out.println("CustomLifecycleOwner: ON_STOP事件已分发");
}
/**
* 模拟Activity的onDestroy方法
*/
public void onDestroy() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
System.out.println("CustomLifecycleOwner: ON_DESTROY事件已分发");
}
}
Kotlin代码:
Kotlin
class CustomLifecycleOwner : LifecycleOwner {
private val lifecycleRegistry = LifecycleRegistry(this)
override fun getLifecycle(): Lifecycle = lifecycleRegistry
fun onCreate() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
}
fun onStart() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
}
流程总结:
核心接口 :实现
LifecycleOwner接口,提供getLifecycle()方法状态管理 :使用
LifecycleRegistry来管理生命周期状态事件分发 :在适当的时机调用
handleLifecycleEvent()方法观察者模式:其他组件可以通过添加观察者来自动响应生命周期变化
状态检查:可以随时检查当前生命周期状态,确保操作安全
这种设计的美妙之处在于它创造了一种清晰的契约关系。作为生命周期拥有者,你不必关心谁在观察你,你只需要在适当的时机发出生命周期事件。观察者会自动响应这些事件,执行相应的逻辑。
2.2 Lifecycle
Lifecycle是Lifecycle的核心组件,它是一个状态机,精确地描述了组件的生命周期状态。理解Lifecycle的关键在于区分两种概念:状态(State)和事件(Event)。
状态枚举:
Kotlin
enum class State {
DESTROYED, // 已销毁
INITIALIZED, // 已初始化
CREATED, // 已创建
STARTED, // 已启动
RESUMED // 已恢复
}
状态是持久的,它描述了一个组件在某个时间点的"稳定"状况。这些状态形成了一个严格的层次结构,从DESTROYED到RESUMED,状态逐渐"活跃"。
事件枚举:
Kotlin
enum class Event {
ON_CREATE, // 创建事件
ON_START, // 启动事件
ON_RESUME, // 恢复事件
ON_PAUSE, // 暂停事件
ON_STOP, // 停止事件
ON_DESTROY, // 销毁事件
ON_ANY // 任意事件
}
事件则是瞬时的 ,它表示从一个状态切换到另一个状态的"动作"。当用户从一个Activity切换到另一个Activity时,系统会触发一系列事件:ON_PAUSE、ON_STOP,可能还有ON_DESTROY(如果系统需要回收内存)。
理解状态和事件的关系至关重要。当ON_START事件发生时,组件的状态会从CREATED变为STARTED。这种状态机的设计确保了生命周期的管理是确定性的,避免了竞态条件的发生。这章先介绍下概念,后面会结合源码来观察期工作原理。
2.3 LifecycleObserver
LifecycleObserver是一个标记接口 ,表示一个能够观察生命周期变化的组件。观察者可以注册到LifecycleOwner上,当LifecycleOwner的状态发生变化时,观察者会收到通知。
这种观察者模式的设计带来了巨大的灵活性。观察者可以是任何组件:一个位置监听器、一个网络请求管理器、一个传感器控制器,甚至是你的自定义业务逻辑组件。它们不再需要直接嵌入到Activity或Fragment中,而是可以独立存在,只通过生命周期事件与UI组件交互。
三、Lifecycle 的四种使用方式
3.1 方式一:实现 DefaultLifecycleObserver(推荐)
Java代码:
java
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import android.util.Log;
/**
* LifecycleObserver 实现
*/
public class MyObserver implements DefaultLifecycleObserver {
private static final String TAG = "Lifecycle";
/**
* 当 LifecycleOwner 创建时调用
* 对应 Activity/Fragment 的 onCreate() 方法
*/
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
Log.d(TAG, "onCreate");
// 可以在这里进行初始化操作
// 例如:初始化资源、设置监听器等
}
/**
* 当 LifecycleOwner 启动时调用
* 对应 Activity/Fragment 的 onStart() 方法
*/
@Override
public void onStart(@NonNull LifecycleOwner owner) {
Log.d(TAG, "onStart");
// 可以在这里开始执行需要界面可见的操作
// 例如:启动动画、开始数据更新等
}
/**
* 当 LifecycleOwner 恢复时调用
* 对应 Activity/Fragment 的 onResume() 方法
*/
@Override
public void onResume(@NonNull LifecycleOwner owner) {
Log.d(TAG, "onResume");
// 可以在这里恢复之前暂停的操作
// 例如:恢复动画、重新连接服务等
}
/**
* 当 LifecycleOwner 暂停时调用
* 对应 Activity/Fragment 的 onPause() 方法
*/
@Override
public void onPause(@NonNull LifecycleOwner owner) {
Log.d(TAG, "onPause");
// 可以在这里暂停当前操作
// 例如:暂停动画、保存临时数据等
}
/**
* 当 LifecycleOwner 停止时调用
* 对应 Activity/Fragment 的 onStop() 方法
*/
@Override
public void onStop(@NonNull LifecycleOwner owner) {
Log.d(TAG, "onStop");
// 可以在这里停止不需要在后台运行的操作
// 例如:停止定时器、断开网络连接等
}
/**
* 当 LifecycleOwner 销毁时调用
* 对应 Activity/Fragment 的 onDestroy() 方法
*/
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
Log.d(TAG, "onDestroy");
// 可以在这里清理资源
// 例如:释放内存、取消注册监听器等
}
}
Kotlin代码:
Kotlin
class MyObserver : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
Log.d("Lifecycle", "onCreate")
}
override fun onResume(owner: LifecycleOwner) {
Log.d("Lifecycle", "onResume")
}
override fun onDestroy(owner: LifecycleOwner) {
Log.d("Lifecycle", "onDestroy")
}
}
// 注册观察者
lifecycle.addObserver(MyObserver())
3.2 方式二:使用注解(已废弃,但需要了解)
Kotlin
@Deprecated("使用 DefaultLifecycleObserver 替代")
class MyAnnotationObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connectListener() {
// 连接监听器
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnectListener() {
// 断开监听器
}
}
3.3 方式三:实现 LifecycleEventObserver
Java代码:
java
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import android.util.Log;
public class MyEventObserver implements LifecycleEventObserver {
private static final String TAG = "LifecycleEvent";
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
switch (event) {
case ON_CREATE:
Log.d(TAG, "ON_CREATE 事件");
// 处理创建事件
break;
case ON_START:
Log.d(TAG, "ON_START 事件");
// 处理启动事件
break;
case ON_RESUME:
Log.d(TAG, "ON_RESUME 事件");
// 处理恢复事件
break;
case ON_PAUSE:
Log.d(TAG, "ON_PAUSE 事件");
// 处理暂停事件
break;
case ON_STOP:
Log.d(TAG, "ON_STOP 事件");
// 处理停止事件
break;
case ON_DESTROY:
Log.d(TAG, "ON_DESTROY 事件");
// 处理销毁事件
break;
default:
Log.d(TAG, "其他事件: " + event);
break;
}
}
}
Kotlin代码:
Kotlin
class MyEventObserver : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_RESUME -> {
// 处理恢复事件
}
Lifecycle.Event.ON_PAUSE -> {
// 处理暂停事件
}
else -> {}
}
}
}
3.4 方式四:自定义 LifecycleObserver
Kotlin
interface MyCustomObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart()
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop()
}
四、Lifecycle 的高级特性详解
接下来结合详细的例子,讲解一些使用特性。
4.1 生命周期感知型组件:现代Android架构的核心
生命周期感知型组件遵循以下设计原则:
自我管理:组件自己知道何时开始、何时停止
解耦:与UI组件解耦,可以在多个地方复用
自动化:自动响应生命周期变化,无需手动调用
可测试:可以独立于Activity/Fragment进行测试
位置监听器优化版的详细解析:
java
/**
* 生命周期感知的位置监听器
*
* 设计特点:
* 1. 自动注册到生命周期
* 2. 自动管理位置服务的启动和停止
* 3. 防止内存泄漏
* 4. 节省设备电量
*/
public class LifecycleAwareLocationListener
implements DefaultLifecycleObserver {
private final Context context;
private final Lifecycle lifecycle;
private final LocationCallback callback;
private LocationManager locationManager;
// 位置更新监听器
private final LocationListener locationListener =
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// 将位置信息传递给回调
callback.onLocationReceived(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// 处理状态变化
}
@Override
public void onProviderEnabled(String provider) {
// 处理提供者启用
}
@Override
public void onProviderDisabled(String provider) {
// 处理提供者禁用
}
};
/**
* 构造方法 - 关键设计点
* @param context 应用上下文(使用Application Context避免内存泄漏)
* @param lifecycle 要观察的生命周期对象
* @param callback 位置更新回调
*/
public LifecycleAwareLocationListener(
@NonNull Context context,
@NonNull Lifecycle lifecycle,
@NonNull LocationCallback callback) {
this.context = context.getApplicationContext(); // 使用Application Context
this.lifecycle = lifecycle;
this.callback = callback;
// 自动注册为生命周期观察者
this.lifecycle.addObserver(this);
Log.d("LocationListener", "位置监听器已创建并注册到生命周期");
}
/**
* 当LifecycleOwner进入STARTED状态时调用
* 对应Activity的onStart()或Fragment的onStart()
*/
@Override
public void onStart(@NonNull LifecycleOwner owner) {
Log.d("LocationListener", "开始监听位置");
// 获取位置服务
locationManager = (LocationManager)
context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
Log.w("LocationListener", "无法获取位置服务");
return;
}
try {
// 检查位置权限
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
// 请求位置更新
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, // 使用GPS提供者
1000L, // 最小时间间隔:1秒
10.0f, // 最小距离变化:10米
locationListener // 位置监听器
);
Log.i("LocationListener", "位置更新已启动");
} else {
Log.w("LocationListener", "缺少位置权限");
}
} catch (SecurityException e) {
Log.e("LocationListener", "权限异常: " + e.getMessage());
}
}
/**
* 当LifecycleOwner进入STOPPED状态时调用
* 对应Activity的onStop()或Fragment的onStop()
*/
@Override
public void onStop(@NonNull LifecycleOwner owner) {
Log.d("LocationListener", "停止监听位置");
if (locationManager != null) {
try {
// 移除位置更新监听
locationManager.removeUpdates(locationListener);
locationManager = null;
Log.i("LocationListener", "位置更新已停止");
} catch (SecurityException e) {
Log.e("LocationListener", "停止监听时权限异常: " + e.getMessage());
}
}
}
/**
* 当LifecycleOwner被销毁时调用
* 清理所有资源
*/
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
Log.d("LocationListener", "清理位置监听器资源");
// 确保位置服务已停止
onStop(owner);
// 移除生命周期观察(重要!防止内存泄漏)
lifecycle.removeObserver(this);
Log.i("LocationListener", "位置监听器已完全清理");
}
/**
* 位置回调接口
*/
public interface LocationCallback {
void onLocationReceived(Location location);
}
}
使用示例:
java
public class MainActivity extends AppCompatActivity {
private LifecycleAwareLocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建位置监听器 - 非常简单!
locationListener = new LifecycleAwareLocationListener(
this,
getLifecycle(),
new LifecycleAwareLocationListener.LocationCallback() {
@Override
public void onLocationReceived(Location location) {
// 更新UI显示位置
updateLocationUI(location);
}
}
);
// 注意:不需要手动调用任何开始/停止方法!
// 组件会自动管理自己的生命周期
}
private void updateLocationUI(Location location) {
// 更新UI
runOnUiThread(() -> {
TextView tvLocation = findViewById(R.id.tv_location);
tvLocation.setText(String.format("纬度: %.6f, 经度: %.6f",
location.getLatitude(), location.getLongitude()));
});
}
}
此时功能模块的 开始/停止 方法就无需放在 Acitivity 里了,完全交给模块自己去管理。
4.2 生命周期状态判断:编写健壮的代码
为什么需要状态判断?
在Android开发中,很多操作只能在特定的生命周期状态下执行:
UI操作:只能在界面活跃时更新UI
资源访问:只能在组件初始化后才能访问资源
异步回调:需要检查组件是否还存在
配置变更:需要正确处理配置变化
状态判断的最佳实践:
java
public class SafeLifecycleOperations {
/**
* 示例1:基本的生命周期状态检查
*/
public void performSafeOperation(Lifecycle lifecycle) {
// 检查是否至少处于 STARTED 状态
if (lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
// 安全执行需要界面可见的操作
Log.d("SafeOps", "可以安全执行UI更新");
updateUI();
} else {
Log.w("SafeOps", "界面不可见,延迟执行操作");
// 可以延迟执行或记录日志
}
}
/**
* 示例2:复杂的状态条件判断
*/
public void handleComplexState(Lifecycle lifecycle) {
Lifecycle.State currentState = lifecycle.getCurrentState();
switch (currentState) {
case RESUMED:
// 界面完全活跃,可以执行所有操作
startRealTimeUpdates();
break;
case STARTED:
// 界面可见但可能被部分遮挡
// 可以继续数据加载,但暂停动画
pauseAnimations();
break;
case CREATED:
// 界面不可见,但组件还存在
// 可以保存状态,但不能执行UI操作
saveCurrentState();
break;
case DESTROYED:
// 组件已销毁,只能执行清理操作
cleanupResources();
break;
default:
Log.d("SafeOps", "当前状态: " + currentState);
break;
}
}
/**
* 示例3:处理异步回调
* 这是一个常见问题:网络请求返回时,Activity可能已经销毁
*/
public void handleAsyncCallback(Lifecycle lifecycle, Callback callback) {
// 在执行异步操作前检查状态
if (!lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
Log.w("Async", "组件不活跃,取消操作");
return;
}
// 执行异步操作
new Thread(() -> {
// 模拟网络请求
String result = fetchDataFromNetwork();
// 在回调时再次检查状态
runOnUiThread(() -> {
if (lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
// 安全地更新UI
callback.onResult(result);
} else {
Log.w("Async", "组件已销毁,丢弃结果: " + result);
}
});
}).start();
}
/**
* 示例4:状态比较的高级用法
*/
public void compareLifecycleStates(Lifecycle lifecycle1, Lifecycle lifecycle2) {
// 比较两个生命周期对象的状态
Lifecycle.State state1 = lifecycle1.getCurrentState();
Lifecycle.State state2 = lifecycle2.getCurrentState();
// 使用枚举的比较方法
if (state1.compareTo(state2) > 0) {
Log.d("Compare", "组件1比组件2更活跃");
} else if (state1.compareTo(state2) < 0) {
Log.d("Compare", "组件2比组件1更活跃");
} else {
Log.d("Compare", "两个组件状态相同");
}
}
/**
* 示例5:状态检查的封装工具类
*/
public static class LifecycleUtils {
/**
* 检查是否可以安全执行UI操作
*/
public static boolean canUpdateUI(Lifecycle lifecycle) {
return lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED);
}
/**
* 检查是否可以启动新组件
*/
public static boolean canStartComponent(Lifecycle lifecycle) {
return lifecycle.getCurrentState().isAtLeast(Lifecycle.State.CREATED);
}
/**
* 检查是否已经销毁
*/
public static boolean isDestroyed(Lifecycle lifecycle) {
return lifecycle.getCurrentState() == Lifecycle.State.DESTROYED;
}
/**
* 等待特定状态
* 用于测试或需要同步的场景
*/
public static void waitForState(Lifecycle lifecycle,
Lifecycle.State targetState,
long timeoutMillis)
throws InterruptedException {
long startTime = System.currentTimeMillis();
while (lifecycle.getCurrentState() != targetState) {
if (System.currentTimeMillis() - startTime > timeoutMillis) {
throw new IllegalStateException("等待状态超时");
}
// 短暂休眠避免忙等待
Thread.sleep(50);
}
}
}
}
五、最佳实践和常见问题
5.1 最佳实践
-
单一职责:每个 Observer 只关注一个特定功能
-
及时清理:在合适的生命周期方法中释放资源
-
状态检查:执行操作前检查生命周期状态
-
避免内存泄漏:使用弱引用或 ViewModel
-
测试覆盖:编写生命周期相关的单元测试
5.2 常见问题及解决方案
问题1:内存泄漏
Kotlin
// 错误示例:持有 Activity 强引用
class LeakyObserver(private val activity: Activity) : LifecycleObserver
// 正确示例:使用弱引用或 Application Context
class SafeObserver(context: Context) : LifecycleObserver {
private val appContext = context.applicationContext
}
问题2:重复注册观察者
Kotlin
// 解决方案:使用 AtomicBoolean 或检查状态
class SafeObserver : LifecycleObserver {
private val isRegistered = AtomicBoolean(false)
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun register() {
if (!isRegistered.getAndSet(true)) {
// 注册逻辑
}
}
}
5.3 测试策略
Kotlin
@RunWith(AndroidJUnit4::class) // 使用AndroidJUnit4测试运行器
class LifecycleObserverTest {
@Test
fun testObserverLifecycleEvents() {
// 创建测试用的 LifecycleOwner
val lifecycleOwner = TestLifecycleOwner()
val observer = TestLifecycleObserver()
// 注册观察者
lifecycleOwner.lifecycle.addObserver(observer)
// 模拟生命周期事件
lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_START)
lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
// 验证回调被调用
assertThat(observer.onCreateCalled).isTrue()
assertThat(observer.onStartCalled).isTrue()
assertThat(observer.onResumeCalled).isTrue()
}
}
简单的讲就是从 "被动依赖" 升级到了"主动控制"
📊 对比总结
| 方面 | 传统方式(依赖Activity) | 现代方式(主动模拟) |
|---|---|---|
| 测试速度 | 慢(秒级) | 快(毫秒级) |
| 执行环境 | 需要Android环境 | 纯Java环境 |
| 控制精度 | 粗粒度 | 细粒度(精确到每个事件) |
| 测试稳定性 | 不稳定(依赖设备) | 非常稳定 |
| 边界测试 | 困难 | 容易 |
| CI/CD集成 | 复杂 | 简单 |
| 开发效率 | 低 | 高 |