didChangeAppLifecycleState method
函数回调时机: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;
}
}
}