applicationWillTerminate 与 applicationWillResignActive 与 applicationDidEnterBackground?它们到底什么时候被触发?

hel*_*ach 2 objective-c ios swift

我知道存在类似的问题,但我认为这个问题更为笼统,并且没有回答我试图找出的具体细节。

我已经阅读了苹果文档,但我仍然对这些方法何时被触发感到有点困惑。从 Apple 文档来看,iOS 应用程序似乎可以进行以下状态转换:

  1. 应用程序在前台终止(例如双击主页按钮并向上滑动应用程序):applicationWillTerminate在这种情况下肯定会触发,实际上这是我不太困惑的唯一情况。

  2. 应用程序切换到后台,同时仍在后台运行(对于“支持后台执行的应用程序”引用苹果文档):applicationDidEnterBackground被触发?applicationWillResignActive是否触发?

  3. 后台运行的应用程序被终止:applicationWillTerminate根据Apple文档可能(?)被触发...所以它有时可能会或可能不会被触发?

  4. App切换到后台立即暂停:applicationDidEnterBackgroundapplicationWillResignActive都被触发?

  5. 后台运行的应用程序被暂停:applicationWillResignActive是否被触发?或者什么都没有触发?

  6. “不支持后台执行”的App切换到后台:applicationWillTerminate根据Apple文档触发?但这到底讲的是什么呢?

  7. 应用程序在前台崩溃:我想在这种情况下不会触发任何内容?

  8. 后台运行的应用程序崩溃:在这种情况下也不会触发任何内容,对吗?

  9. 后台挂起的应用程序被终止:我想又没有触发任何内容?

我认为苹果文档在解释这些方法时要么有些模糊,要么完全令人困惑。有时他们谈论“支持后台执行的应用程序”与“不支持后台执行的应用程序”,有时他们谈论“在后台运行”与“暂停”,有时他们只是说“用户退出”应用程序,它开始过渡到后台状态“或”来电或短信“,这是现实世界的用例而不是技术概念。

因此,任何人都可以帮助用更一致的技术术语解释这些方法在特定情况下到底何时触发?

编辑:不知道为什么这个问题被认为不“集中”,因为我正在尝试使用这些应用程序委托方法,但经过一些个人测试和阅读官方文档后,我仍然不知所措,这些方法到底何时会出现被触发以及我如何可靠地使用它们。

也许我可以借用 PGDev 答案中的一些内容来详细说明,所以如果我理解正确的话,iOS 应用程序可以处于 5 种状态:

  1. 未运行
  2. 不活跃
  3. 积极的
  4. 暂停
  5. 背景

并且当应用程序改变状态时,可能会触发一些委托方法,但从苹果官方文档来看,在哪些状态转换期间会触发哪些方法似乎非常混乱。

例如,我不确定当应用程序从状态 5 进入状态 4 时,当应用程序从状态 5 进入状态 1 时,以及当应用程序从状态 4 进入状态 1 时,会触发什么或是否会触发任何方法。苹果官方文档似乎说,applicationWillTerminate如果“不支持后台执行的应用程序”切换到后台,就会触发该功能,但是我无法applicationWillTerminate通过按主页按钮来触发任何类型的应用程序。

就目前而言,我不确定我是否可以可靠地利用这些方法来做任何事情,这就是为什么我希望有人能够更清楚地了解这些方法何时被触发(而不是触发),除了那些模糊的描述之外苹果官方文档。

PGD*_*Dev 5

以下是应用程序生命周期方法如何工作的详细说明。

\n

应用程序的生命周期存在5种状态,

\n
    \n
  1. 未运行\xe2\x80\x94 应用程序未运行。

    \n
  2. \n
  3. 不活动的\xe2\x80\x94 在前台运行 + 未接收事件

    \n
      \n
    • iOS 应用程序可以置于非活动状态,例如,当收到呼叫或短信时。(前台 + 未运行)
    • \n
    \n
  4. \n
  5. 活跃的\xe2\x80\x94在前台运行+接收事件

    \n
  6. \n
  7. 暂停\xe2\x80\x94在后台运行+不执行代码

    \n
  8. \n
  9. 后台\xe2\x80\x94 后台运行 + 执行代码

    \n
  10. \n
\n

接下来,存在7 个委托方法,只要应用程序会话中上述状态发生更改,就会调用这些方法。

\n

发射时间

\n
    \n
  1. application:willFinishLaunchingWithOptions

    \n
      \n
    • 启动启动过程时调用的方法。
    • \n
    • 这是在应用程序内执行任何代码的第一次机会。
    • \n
    • 发射过程已经开始,但状态恢复尚未发生。
    • \n
    \n
  2. \n
  3. didFinishLaunchingWithOptions

    \n
      \n
    • 当\xc2\xa0launch 进程即将完成并且应用程序几乎准备好运行时调用的方法。最终\xc2\xa0初始化。
    • \n
    \n
  4. \n
\n

过渡到前台

\n
    \n
  1. applicationDidBecomeActive\n
      \n
    • 应用程序已激活。
    • \n
    \n
  2. \n
\n

过渡到后台

\n
    \n
  1. applicationDidEnterBackground\n
      \n
    • 当 iOS 应用程序正在运行但不再在前台时调用此方法
    • \n
    \n
  2. \n
\n

转换到非活动状态:

\n
    \n
  1. applicationWillResignActive

    \n
      \n
    • 从活动状态退出到另一个状态
    • \n
    • 每次发生临时事件(例如电话)时,都会调用此方法
    • \n
    • 当应用程序移至后台时调用
    • \n
    \n
  2. \n
  3. applicationWillEnterForeground

    \n
      \n
    • 即将从后台进入->前台
    • \n
    \n
  4. \n
\n

终止

\n
    \n
  1. applicationWillTerminate\n
      \n
    • 应用程序即将终止。
    • \n
    • 强制退出 iOS 应用程序,或关闭设备
    • \n
    • 这是保存应用程序配置、设置和用户首选项的机会。
    • \n
    \n
  2. \n
\n

上述方法的调用顺序的一些流程示例。

\n
    \n
  • 启动应用程序 \xe2\x80\x94 1, 2, 3 \xe2\x80\x94 willLaunch+ didLaunch+didBecomeActive
  • \n
  • 按 home \xe2\x80\x94 5, 4 \xe2\x80\x94 resignActive+didEnterBackground
  • \n
  • 从后台打开应用程序 \xe2\x80\x94 6, 3 \xe2\x80\x94 willEnterForeground+didBecomeActive
  • \n
  • 打开任务管理器 \xe2\x80\x94 5 \xe2\x80\x94resignActive
  • \n
  • 当应用程序在前台时来电 \xe2\x80\x94 5 \xe2\x80\x94resignActive
  • \n
\n

您可以使用上面的示例来测试 lfecycle 方法的执行。

\n