应用生命周期组件
应用生命周期组件用于监听和处理应用的各种状态变化。
提示:理解应用生命周期对于创建响应式的应用非常重要。
生命周期状态示意图
resumed
应用活跃中
inactive
非活动状态
paused
应用暂停
detached
即将销毁
AppLifecycleState
AppLifecycleState 定义了应用的不同生命周期状态。
enum AppLifecycleState {
resumed, // 应用可见且响应用户输入
inactive, // 应用处于非活动状态(如来电、通知)
paused, // 应用不可见且不响应用户输入
detached, // 应用即将被销毁
hidden, // 应用处于后台
}
WidgetsBindingObserver
WidgetsBindingObserver 是一个观察者接口,用于监听系统事件。
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print('应用状态变化: $state');
// 根据状态执行相应操作
}
}
生命周期切换示例
paused
→
resumed
应用恢复到前台
resumed
→
inactive
来电或通知
inactive
→
paused
按Home键
didChangeAppLifecycleState
didChangeAppLifecycleState 在应用生命周期状态改变时被调用。
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
// 应用恢复到前台
print('应用恢复');
// 恢复网络请求、动画等
break;
case AppLifecycleState.inactive:
// 应用变为非活动状态
print('应用非活动');
// 暂停不需要的操作
break;
case AppLifecycleState.paused:
// 应用进入后台
print('应用暂停');
// 保存数据、暂停动画等
break;
case AppLifecycleState.detached:
// 应用即将被销毁
print('应用分离');
// 清理资源
break;
case AppLifecycleState.hidden:
// 应用处于后台
print('应用隐藏');
break;
}
}
resumed
应用可见且响应用户输入时的状态。
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
// 恢复视频播放
videoController.play();
// 重新连接 WebSocket
reconnectWebSocket();
// 刷新数据
refreshData();
}
}
resumed 状态应用行为
当前状态: resumed
应用可见且响应输入
执行的操作:
✓ 恢复视频播放
✓ 重新连接 WebSocket
✓ 刷新数据
✓ 重新连接 WebSocket
✓ 刷新数据
paused 状态应用行为
当前状态: paused
应用不可见,不响应输入
执行的操作:
⏸ 暂停视频播放
📡 断开网络连接
💾 保存当前状态
📡 断开网络连接
💾 保存当前状态
paused
应用不可见且不响应用户输入时的状态。
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.paused) {
// 暂停视频播放
videoController.pause();
// 断开网络连接
disconnectWebSocket();
// 保存当前状态
saveAppState();
}
}
detached 状态应用行为
当前状态: detached
应用即将被销毁
执行的操作:
🗑 释放视频控制器
🗑 释放音频控制器
⏰ 取消所有定时器
💾 保存最终状态
🗑 释放音频控制器
⏰ 取消所有定时器
💾 保存最终状态
detached
应用即将被销毁时的状态。
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.detached) {
// 释放所有资源
videoController.dispose();
audioController.dispose();
// 取消所有定时器
cancelAllTimers();
// 保存最终状态
saveFinalState();
}
}
生命周期最佳实践:
- 在 initState 中注册观察者
- 在 dispose 中移除观察者
- 在 paused 时保存数据
- 在 resumed 时恢复操作
- 在 detached 时清理资源
注意事项:
- Web 平台的生命周期可能有所不同
- 测试时需要模拟不同的生命周期状态
- 某些操作在不同平台上的行为可能不同