didChangeAppLifecycleState method

  1. @override
void didChangeAppLifecycleState(
  1. AppLifecycleState state
)
override

函数回调时机:1.正常切换前台/后台 2.系统级别弹窗&activity / 自定义开启弹窗&activity 1.正常切换前后台 1.1 切到后台:inactive > paused 1.2 切回前台:resumed 2.系统级别弹窗&activity / 自定义开启弹窗&activity 2.1 非全屏:展示:inactive 消失:resumed 2.1 全屏:展示:inactive > paused 消失:resumed

Implementation

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  /// flutter 所有界面都在同一个Activity/Controller中,因此所有页面都能响应切换前后台的回调
  /// 此处逻辑只需要栈顶页面需要响应 挂起/恢复 回调
  bool isCurrent = _modalRoute?.isCurrent ?? false;
  if (isCurrent) {
    switch (state) {
      case AppLifecycleState.resumed: //恢复交互
        /// 如果执行了 AppLifecycleState.paused 则需要从 onStart 开始
        if (_callStartStateWhenForeground) {
          _dispatchLifecycleState(LifecycleState.onStart);
          _callStartStateWhenForeground = false;
        }

        _dispatchLifecycleState(LifecycleState.onResume);

        break;
      case AppLifecycleState.inactive: //挂起

        ///进入后台 和 从桌面回来 都会执行 inactive 回调,添加逻辑,去除从后台回来的多余执行
        if (!_callStartStateWhenForeground) {
          _dispatchLifecycleState(LifecycleState.onPause);
        }

        break;
      case AppLifecycleState.paused: //停止

        ///切后台执行了 AppLifecycleState.paused ,则认为回到前台生命周期从 onStart 开始
        _callStartStateWhenForeground = true;

        _dispatchLifecycleState(LifecycleState.onStop);
        break;
      case AppLifecycleState.detached: //销毁
        _dispatchLifecycleState(LifecycleState.onDestroy);
        break;
    }
  }
}