likes
comments
collection
share

iOS学Flutter - 生命周期篇:监听App的生命周期iOS学Flutter - 生命周期篇:监听App的生命周期

作者站长头像
站长
· 阅读数 64

iOS学Flutter - 生命周期篇:监听App的生命周期

作为 iOS 开发者,在理解 Flutter 框架中,如何处理应用程序的生命周期、页面的生命周期以及 UI 的更新机制时,常常会参考 AppDelegateUIViewControllerUIView 不同的生命周期管理概念。

应用生命周期的设计反映了不同平台对于应用管理和资源控制的思路。在此,我将首先简要介绍 Flutter 应用的生命周期,然后对比 iOS 的应用生命周期,最后对两种设计的优缺点进行分析。

iOS中App的生命周期

在 iOS 中,应用的生命周期通过 UIApplicationDelegate 进行管理,它提供了一些方法供开发者在应用的不同生命周期阶段进行操作。主要的生命周期方法如下:

  1. application:didFinishLaunchingWithOptions:

    • 应用启动完成并进入未激活状态。
  2. applicationDidBecomeActive:

    • 应用变为活跃状态,可以与用户进行交互。
  3. applicationWillResignActive:

    • 应用即将进入非活跃状态,通常是因为接到电话或锁屏。
  4. applicationDidEnterBackground:

    • 应用进入后台,用户无法与应用交互,iOS 可能会在内存不足时终止应用。
  5. applicationWillEnterForeground:

    • 应用即将从后台进入前台,还未开始与用户交互。
  6. applicationWillTerminate:

    • 应用即将被系统终止或手动关闭,开发者可以在此执行一些清理操作。
iOS 生命周期管理的示例:
 - (void)applicationDidBecomeActive:(UIApplication *)application {
    // 应用进入前台并可交互
 }
 ​
 - (void)applicationDidEnterBackground:(UIApplication *)application {
    // 应用进入后台
 }

Flutter中App的生命周期

在 Flutter 中,整个应用的生命周期主要通过 WidgetsBindingObserver 以及 AppLifecycleState 进行管理。AppLifecycleState 包含四个状态,代表应用的不同生命周期阶段:

  1. inactive:应用在前台但未接收用户输入时进入此状态,通常是短暂的。比如 iOS 上的应用切换、打开通知中心时会进入该状态。

  2. paused:应用处于后台,用户无法看到应用界面,也不能与其交互。此时应用仍然驻留在内存中,并且执行后台任务。

  3. hidden:用于表示应用界面不可见但仍在后台运行。

  4. resumed:应用回到前台并可以与用户交互时进入此状态,这通常是应用运行的主要状态。

  5. detached:应用在完全关闭或者正在被销毁时进入此状态,通常很少用到。

要监听这些状态变化,可以通过 WidgetsBindingObserver 进行实现。通过重写 didChangeAppLifecycleState 方法,开发者可以捕捉应用状态的变化并执行相应的逻辑。

通常是在 主入口的Widget 进行监听,达到类似的AppDelegate 监听App生命周期的作用。

 class MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }
 ​
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
 ​
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    
    switch (state) {
      case AppLifecycleState.inactive:
        //应用程序处于闲置状态并且没有收到用户的输入事件。
        //注意这个状态,在切换到后台时候会触发,所以流程应该是先冻结窗口,然后停止UI
        break;
        
      case AppLifecycleState.detached:
        //从当前页面离开
        break;
        
      case AppLifecycleState.resumed:
        //进入页面的时候不会触发该状态
        //应用程序处于可见状态,并且可以响应用户的输入事件
        break;
        
      case AppLifecycleState.hidden:
        // 用于表示应用界面不可见但仍在后台运行
        break;
        
      case AppLifecycleState.paused:
        //应用程序处于不可见状态
        break;
    }
  }
 }
 ​

需要注意的是:要继承于WidgetsBindingObserver,在初始化中添加监听addObserver

调用顺序

从前台进入后台会依次调用到:

AppLifecycleState.inactive

当应用从前台切换到后台时,系统会先把应用置于「非活动」状态,即应用暂时失去与用户的交互,但 UI 仍然可见。这通常是用户离开应用的过渡状态,例如当用户在应用间切换时,应用会进入 inactive 状态。

AppLifecycleState.hidden

这个状态是 Flutter 框架特有的状态,用于表示应用界面不可见但仍在后台运行。它一般用于特定平台(如 Android 和 iOS)的窗口管理,标志着应用完全离开了用户的视野。

AppLifecycleState.paused

这是应用完全进入后台时的最终状态,表示应用已经不再可见,并且系统可能会减少它的资源分配。此时,应用应该暂停不必要的后台操作,并释放某些资源。

因此,当应用从前台切换到后台时,首先会失去用户交互的能力(inactive),然后窗口变得不可见(hidden),最后进入完全后台运行状态(paused)。

从后台台进入前台会依次调用到:

AppLifecycleState.hidden

当应用从后台返回到前台时,首先会触发 hidden 状态,表示应用窗口开始显示,但尚未完全与用户交互。

AppLifecycleState.inactive

接下来,应用会进入 inactive 状态,这时应用已经可见但仍处于「非活动」状态,可能还在加载一些资源或准备好恢复与用户的交互。

AppLifecycleState.resumed

最后,应用进入 resumed 状态,此时应用完全恢复可见并可以响应用户的交互。这是应用进入前台后最终稳定的状态。

转载自:https://juejin.cn/post/7426545445877121062
评论
请登录