【问题标题】:Which function is called when iPhone app is terminated?iPhone应用程序终止时调用哪个函数?
【发布时间】:2012-04-29 08:09:43
【问题描述】:

我正在开发一个使用 Xcode 4.2.1 和 iOS 5.0 的项目。我想知道当您完全终止应用程序时会调用哪个函数,这意味着即使用户强制在后台运行的应用程序从主屏幕终止。我假设

(void)applicationWillTerminate:(UIApplication *)application

会被调用,但事实证明即使在后台终止应用程序后也没有调用它。 我基本上想要做的是调用我在应用程序完全终止之前创建的方法,因此需要知道在应用程序结束时调用了哪个函数。

谢谢。

【问题讨论】:

  • 请您选择/勾选其中一个答案。
  • @Max 不进入后台状态直接关闭应用时会调用该方法。

标签: iphone xcode ios5


【解决方案1】:

"applicationWillTerminate" 方法只有在应用程序不处于挂起状态而被终止时才会被调用。

要理解这一点,考虑到当前您的应用程序处于前台活动状态,请查看以下两种情况:

案例1:当你单击主页按钮时,应用程序通过调用方法直接进入暂停状态 - (1) applicationWillResignActive 然后 (2) applicationDidEnterBackground。 p>

现在,当您尝试退出/终止应用程序时,双击主页按钮,然后从最近的应用程序屏幕向上滑动当前应用程序屏幕,应用程序处于暂停状态。所以,"applicationWillTerminate" 方法不会被调用。

案例2:当你双击主页按钮时,应用程序通过调用方法进入非活动状态 - (1) applicationWillResignActive。

现在,当您尝试退出/终止应用程序时,通过从最近的应用程序屏幕向上滑动当前应用程序屏幕,应用程序在被终止时处于非活动状态(不是暂停状态)。因此,"applicationWillTerminate" 方法将被调用。

看看苹果怎么说:

有关此外观的更多信息 - Apple's Official Documentation on applicationWillTerminate(_:)

【讨论】:

  • 很好的答案,谢谢!如果还有 Apple 文档的链接会很酷。
【解决方案2】:

Here's a good overview iOS 4.0 及更高版本上的应用程序生命周期通知和委托消息。总之……

您的应用通常不会看到 willTerminate,因为系统通常只会在您的应用已经暂停(在后台)后才会终止它。一旦您的应用程序被暂停,它就没有机会采取行动(*),因此没有回调。

didEnterBackground 委托消息或通知应被视为您在可能终止之前清理或保存状态的最后机会。


(*) 好的,如果您的应用处于受支持的后台执行模式之一(如音频、VoIP 或导航),则它可以执行某些操作,但在这种情况下,它要么尚未暂停,要么尚未暂停具有特定于该后台模式的入口点。

【讨论】:

  • 所以在用户强行终止后台运行的应用程序的情况下,调用我的方法是没有好方法的。感谢您的帮助。
  • 即使那样你也可能不会收到通知;除非用户在进入后台的几秒钟内通过应用切换器终止您的应用,否则您的应用将被暂停。
【解决方案3】:

如果应用已经暂停,它将不会收到进一步的通知。注意didEnterBackground 通知。

【讨论】:

  • 您的意思是说,只要我在主屏幕上,我就无法意识到我想做什么?至于功能,看到这样的功能,我也没找到。
  • -1:没有“willSuspend”通知或委托消息。你可能想要“didEnterBackground”。
  • 我可能不想要它,因为我想在应用程序完全终止时调用一个方法,而不是在按下主页按钮时。也就是说,我不想在刚进入后台时调用我的方法。
  • 当应用程序终止时,您希望您的方法做什么?可能还有办法实现它。
  • 我的项目使用 sqlite3,我希望我的方法在应用程序末尾删除 sqlite3 文件中的所有表,因为我不希望 sqlite3 文件在终止后保留数据(表)应用程序。
【解决方案4】:
- (void)applicationWillTerminate:(UIApplication *)application

它在 UIApplicationDelegate 协议中。

【讨论】:

    【解决方案5】:

    documentation here 说明了这种情况下的行为。

    简而言之,如果应用程序在终止时正在运行(在前台或后台),您只会收到applicationWillTerminate: 消息。因此,除非您的应用程序在前台或长期运行的后台模式之一(例如 VoIP、音频或beginBackgroundTaskWithExpirationHandler 指示的长期运行任务)中运行,否则它将从background 状态转换为@ 987654325@ 状态相当快。在这种情况下,您将永远不会收到 applicationWillTerminate: 消息。

    【讨论】:

      猜你喜欢
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2015-08-20
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多