我们可以在 -applicationWillTerminate 方法中设置一个计时器吗?

Posted

技术标签:

【中文标题】我们可以在 -applicationWillTerminate 方法中设置一个计时器吗?【英文标题】:Can we set a timer in -applicationWillTerminate method? 【发布时间】:2011-12-09 03:12:07 【问题描述】:

我有一个应用程序可以从网页中提取数据并将其填充到 UITableView 中。我看到我的应用程序即使在按下主页按钮很长时间后也不会终止。我意识到如果手机内存不足,操作系统会杀死应用程序。我不想在 pinfo 中执行 “添加密钥 -> 应用程序不在后台运行”。我希望应用程序保持状态一段时间。我想知道我们是否可以在- (void)applicationWillTerminate:(UIApplication *)application 中设置一个计时器 方法,以便应用程序可以在它处于非活动状态 1 小时后终止并重新启动。

谢谢。

【问题讨论】:

纯粹出于好奇,您为什么不想将Application does not run in background 设置为YES 正如我所说,我正在从网页上阅读,我希望我的应用程序能够反映网页上的最新帖子。同时我想保持状态,这样如果他们经常重新访问应用程序,我就不会继续重新加载数据。实际上,这是您答案中的第 2 点。我将尝试在 applicationDidEnterBackground: now 中节省时间。 【参考方案1】:

简单快速的回答,不。你不能在按下主页按钮后一个小时内运行计时器。您可以做的是熟悉用户按下主页按钮然后切换回您的应用时所进行的调用。

这些是您现在将收到的电话(多任务处理):

// User taps your app icon first launch
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

// User pushes home button
applicationWillResignActive:
applicationDidEnterBackground:

// User selects your app again
applicationWillEnterForeground:
applicationDidBecomeActive:

如果您确实将 Application does not run in background 键设置为 YES,或者如果您的设备不支持多任务处理(即 iPod touch 第二代),那么完全相同的操作将调用这些方法。

// User taps your app icon first launch
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

// User pushes home button
applicationDidEnterBackground:
applicationWillTerminate:

// User selects your app again
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

请注意,如果操作系统决定杀死你的应用程序以获得内存,它不会仅仅为了杀死你而唤醒你,你永远不能保证收到applicationWillTerminate: 调用。

我可以想到您提出问题的两个动机:

1) 您想保存状态并想在applicationWillTerminate: 中执行此操作,但它没有被调用。如果是这种情况,我建议将状态保存在 applicationDidEnterBackground: 中,因为在两种情况下都会在用户按下主页按钮时调用它。

2) 如果应用程序处于非活动状态超过一定时间,您希望重新加载数据。如果是这种情况,请在 applicationDidEnterBackground: 期间存储当前时间,并检查在 applicationDidBecomeActive: 中已经过去了多少时间,并在必要时重新加载。

【讨论】:

【参考方案2】:

当您的应用程序移至后台时,您可以请求额外的时间(我认为最多 500 秒?)来完成一些长时间运行的任务(参见 -beginBackgroundTaskWithExpirationHandler:UIApplication)。但是您永远不能安排您的应用“唤醒”或在后台/终止后重新加载。

对于跟踪用户位置或需要接收 VOIP 来电的应用,此规则有特定的例外情况。如果您的应用符合条件,请参阅 ios 应用编程指南的 Background Execution and Mutitasking 部分。

【讨论】:

以上是关于我们可以在 -applicationWillTerminate 方法中设置一个计时器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果我们不提供广告,我们可以使用 IDFA

我们可以使用 Visual Studio 在 VSTS 中检查点吗?

我们可以在 C++ 中有一个静态类吗?

我们可以选择在 sklearn 中使用啥决策树算法吗?

我们可以在后台播放音频吗

消息队列:我们可以在消息进入队列时触发事件吗?