在这里插入图片描述

Flutter Embedding层的生命周期管理是保证应用稳定运行的关键。它需要协调Flutter引擎的生命周期与平台组件的生命周期。

一、生命周期概述

Flutter应用的生命周期分为引擎级、应用级、页面级三个层次,每个层次都有其特定的生命周期阶段。

// 生命周期状态
enum AppLifecycleState {
  detached,     // 应用分离
  inactive,     // 应用不活跃
  paused,       // 应用暂停
  hidden,       // 应用隐藏
  resumed,      // 应用恢复
}

生命周期层次

引擎生命周期

应用生命周期

页面生命周期

引擎初始化

引擎启动

引擎运行

引擎暂停

引擎销毁

二、引擎生命周期

引擎生命周期是Flutter运行的最底层生命周期,管理Flutter引擎的创建、运行和销毁。

引擎生命周期状态

状态 说明 触发条件
Initialized 引擎已初始化 调用FlutterEngine构造函数
Running 引擎正在运行 调用run方法
Paused 引擎已暂停 应用进入后台
Destroyed 引擎已销毁 调用destroy方法

引擎生命周期示例

// 引擎生命周期管理
class EngineLifecycleManager {
  FlutterEngine? _engine;

  Future<void> initEngine() async {
    // 初始化引擎
    _engine = FlutterEngine();
    await _engine!.initializeEngine();

    print('引擎已初始化');
  }

  void startEngine() {
    // 启动引擎
    _engine?.run();
    print('引擎已启动');
  }

  void pauseEngine() {
    // 暂停引擎
    _engine?.lifecycleController.pauseEngine();
    print('引擎已暂停');
  }

  void resumeEngine() {
    // 恢复引擎
    _engine?.lifecycleController.resumeEngine();
    print('引擎已恢复');
  }

  void destroyEngine() {
    // 销毁引擎
    _engine?.destroy();
    _engine = null;
    print('引擎已销毁');
  }
}

三、应用生命周期

应用生命周期对应于平台的Activity/ViewController/Ability生命周期。

应用生命周期状态

状态 Android iOS HarmonyOS 说明
created onCreate viewDidLoad onCreate 组件创建
started onStart viewWillAppear onForeground 组件启动
resumed onResume viewDidAppear onActive 组件活跃
paused onPause viewWillDisappear onInactive 组件暂停
stopped onStop viewDidDisappear onBackground 组件停止
destroyed onDestroy dealloc onDestroy 组件销毁

应用生命周期监听

// 应用生命周期监听器
class AppLifecycleObserver extends StatefulWidget {
  
  _AppLifecycleObserverState createState() => _AppLifecycleObserverState();
}

class _AppLifecycleObserverState extends State<AppLifecycleObserver>
    with WidgetsBindingObserver {
  AppLifecycleState? _lastLifecycleState;

  
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  
  void didChangeAppLifecycleState(AppLifecycleState state) {
    setState(() {
      _lastLifecycleState = state;
    });

    switch (state) {
      case AppLifecycleState.resumed:
        print('应用恢复');
        _handleResumed();
        break;
      case AppLifecycleState.inactive:
        print('应用不活跃');
        _handleInactive();
        break;
      case AppLifecycleState.paused:
        print('应用暂停');
        _handlePaused();
        break;
      case AppLifecycleState.detached:
        print('应用分离');
        _handleDetached();
        break;
      case AppLifecycleState.hidden:
        print('应用隐藏');
        _handleHidden();
        break;
    }
  }

  void _handleResumed() {
    // 恢复动画、定时器等
  }

  void _handleInactive() {
    // 暂停不重要的操作
  }

  void _handlePaused() {
    // 释放资源、保存状态
  }

  void _handleDetached() {
    // 清理所有资源
  }

  void _handleHidden() {
    // 处理隐藏状态
  }

  
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Container(
      child: Text('当前状态: $_lastLifecycleState'),
    );
  }
}

四、页面生命周期

页面生命周期对应于Flutter Widget的生命周期。

页面生命周期方法

方法 调用时机 用途
createState Widget首次插入树时 创建State对象
initState State对象创建后 初始化状态
didChangeDependencies 依赖变化时 更新依赖相关的状态
build 需要构建UI时 构建Widget树
didUpdateWidget 父Widget重建时 更新State
setState 调用setState方法 标记需要重建
deactivate Widget从树中移除时 清理资源
dispose Widget永久销毁时 最终清理

页面生命周期示例

// 页面生命周期演示
class PageLifecycleDemo extends StatefulWidget {
  
  _PageLifecycleDemoState createState() => _PageLifecycleDemoState();
}

class _PageLifecycleDemoState extends State<PageLifecycleDemo>
    with RouteAware {
  final List<String> _lifecycleLog = [];

  
  void initState() {
    super.initState();
    _log('initState: 页面初始化');
  }

  
  void didChangeDependencies() {
    super.didChangeDependencies();
    _log('didChangeDependencies: 依赖变化');
  }

  
  void didUpdateWidget(PageLifecycleDemo oldWidget) {
    super.didUpdateWidget(oldWidget);
    _log('didUpdateWidget: Widget更新');
  }

  
  void deactivate() {
    super.deactivate();
    _log('deactivate: 页面停用');
  }

  
  void dispose() {
    _log('dispose: 页面销毁');
    super.dispose();
  }

  void _log(String message) {
    setState(() {
      _lifecycleLog.insert(0, '$message - ${DateTime.now().toString().substring(11, 19)}');
    });
    if (_lifecycleLog.length > 10) {
      _lifecycleLog.removeLast();
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('页面生命周期')),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: _lifecycleLog.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_lifecycleLog[index]),
                );
              },
            ),
          ),
          ElevatedButton(
            onPressed: () => setState(() {}),
            child: const Text('触发重建'),
          ),
        ],
      ),
    );
  }
}

五、生命周期同步

Flutter引擎的生命周期需要与平台组件的生命周期保持同步。

同步机制

Flutter引擎 Embedding层 平台组件 Flutter引擎 Embedding层 平台组件 onCreate initializeEngine Initialized 初始化完成 onResume resumeEngine Running 恢复完成 onPause pauseEngine Paused 暂停完成 onDestroy destroyEngine Destroyed 销毁完成

同步实现

// 生命周期同步器
class LifecycleSynchronizer {
  final FlutterEngine _engine;

  LifecycleSynchronizer(this._engine);

  // 同步平台生命周期到Flutter引擎
  void syncPlatformLifecycle(PlatformLifecycleState state) {
    switch (state) {
      case PlatformLifecycleState.created:
        _onPlatformCreated();
        break;
      case PlatformLifecycleState.resumed:
        _onPlatformResumed();
        break;
      case PlatformLifecycleState.paused:
        _onPlatformPaused();
        break;
      case PlatformLifecycleState.destroyed:
        _onPlatformDestroyed();
        break;
    }
  }

  void _onPlatformCreated() {
    // 平台组件创建完成
    _engine.lifecycleController.notifyCreated();
  }

  void _onPlatformResumed() {
    // 平台组件恢复
    _engine.lifecycleController.notifyResumed();
  }

  void _onPlatformPaused() {
    // 平台组件暂停
    _engine.lifecycleController.notifyPaused();
  }

  void _onPlatformDestroyed() {
    // 平台组件销毁
    _engine.lifecycleController.notifyDestroyed();
  }
}

六、资源管理

生命周期管理中一个重要的方面是资源的合理分配和释放。

资源管理策略

资源类型 分配时机 释放时机 管理方式
动画控制器 initState dispose AnimationController
定时器 需要时 dispose Timer
订阅 initState dispose StreamSubscription
文件句柄 需要时 dispose File
网络连接 需要时 dispose HttpClient

资源管理示例

// 资源管理器
class ResourceManager extends StatefulWidget {
  
  _ResourceManagerState createState() => _ResourceManagerState();
}

class _ResourceManagerState extends State<ResourceManager>
    with TickerProviderStateMixin {
  late AnimationController _animationController;
  Timer? _timer;
  StreamSubscription? _subscription;

  
  void initState() {
    super.initState();

    // 创建动画控制器
    _animationController = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);

    // 创建定时器
    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      print('定时器触发');
    });

    // 创建订阅
    _subscription = someStream.listen((data) {
      print('收到数据: $data');
    });

    print('资源已分配');
  }

  
  void dispose() {
    // 释放资源
    _animationController.dispose();
    _timer?.cancel();
    _subscription?.cancel();

    print('资源已释放');
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Container(
      child: AnimatedBuilder(
        animation: _animationController,
        builder: (context, child) {
          return Container(
            width: 100,
            height: 100,
            color: Color.fromRGBO(
              255,
              _animationController.value * 255,
              0,
              1.0,
            ),
          );
        },
      ),
    );
  }
}

七、生命周期最佳实践

合理管理生命周期可以避免内存泄漏和资源浪费。

最佳实践

  1. 及时释放资源:在dispose中释放所有资源
  2. 避免内存泄漏:不要在Widget外部持有State的引用
  3. 合理使用const:不变的Widget使用const减少重建
  4. 异步任务取消:在销毁时取消未完成的异步任务

内存泄漏检测

// 内存泄漏检测工具
class MemoryLeakDetector {
  static final Map<String, WeakReference> _references = {};

  static void track(String key, Object object) {
    _references[key] = WeakReference(object);
  }

  static bool isAlive(String key) {
    return _references[key]?.target != null;
  }

  static void cleanup() {
    _references.clear();
  }
}

八、HarmonyOS生命周期适配

HarmonyOS使用Ability组件,其生命周期与Android/iOS有所不同。

HarmonyOS Ability生命周期

状态 说明 对应Flutter状态
onCreate Ability创建 created
onStart Ability启动 started
onActive Ability激活 resumed
onInactive Ability失活 inactive
onBackground Ability后台 paused
onForeground Ability前台 resumed
onStop Ability停止 stopped
onDestroy Ability销毁 destroyed

HarmonyOS适配示例

// HarmonyOS生命周期适配
class HarmonyOSLifecycleAdapter {
  void adaptAbilityLifecycle(AbilityLifecycle state) {
    switch (state) {
      case AbilityLifecycle.onCreate:
        // 处理创建
        break;
      case AbilityLifecycle.onActive:
        // 处理激活
        break;
      case AbilityLifecycle.onInactive:
        // 处理失活
        break;
      case AbilityLifecycle.onBackground:
        // 处理后台
        break;
      case AbilityLifecycle.onForeground:
        // 处理前台
        break;
      case AbilityLifecycle.onStop:
        // 处理停止
        break;
      case AbilityLifecycle.onDestroy:
        // 处理销毁
        break;
    }
  }
}

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐