当一个应用程序从后台被唤醒,你想让它准备为活动时,哪个是正确的委托来实现?

applicationwillenter前台vs applicationDidBecomeActive——有什么区别?

当应用程序将进入睡眠状态,你想让它准备清理和保存数据时,应该实现哪个委托呢?

applicationWillResignActive vs. applicationDidEnterBackground—有什么区别?

此外,我还注意到当传入短信或电话进来时,applicationWillResignActive被调用,但用户选择单击Ok并继续。我不希望我的应用程序在这些情况下采取任何行动。我只是想让它继续运行,没有任何中间清理,因为用户没有退出应用程序。所以,我认为它更有意义,只在applicationDidEnterBackground做清理工作。

我希望您能提供一些最佳实践,帮助我们选择使用哪些委托来唤醒和入睡,以及考虑像被短信/电话打断这样的事件。

谢谢


当前回答

applicationWillResignActive在系统请求权限时被调用。(在iOS 10中)。以防有人遇到和我一样的麻烦……

其他回答

applicationWillResignActive在系统请求权限时被调用。(在iOS 10中)。以防有人遇到和我一样的麻烦……

applicationwillenter前台被称为:

当应用程序重新启动(从后台到前台) 当应用程序第一次启动时,即当applicationDidFinishLaunch被调用时,该方法不会被调用,而只在来自后台时调用 applicationDidBecomeActive

applicationDidBecomeActive被调用

当应用程序在didFinishLaunching后第一次启动时 在applicationwillenter前台之后,如果没有URL要处理。 调用handleOpenURL。 在applicationWillResignActive后,如果用户忽略中断,如电话或短信。 在alertView从应用程序的任何地方消失后

对于iOS 13+,将执行以下方法:

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene

在iOS 8+中,接听电话有一个微妙但重要的区别。

在ios7中,如果用户接听电话,会同时调用applicationWillResignActive:和applicationDidEnterBackground:。但是在iOS 8+中只有applicationWillResignActive:被调用。

我对达诺的回答还是有点困惑,所以我做了一个小测试,以获得某些场景下的事件流,供我参考,但它可能对你也有用。这是针对那些在info.plist中没有使用UIApplicationExitsOnSuspend的应用程序。这是在iOS 8模拟器上进行的,并与iOS 7设备进行了验证。请原谅Xamarin的事件处理程序名称。它们非常相似。

从非运行状态初始启动和所有后续启动:

FinishedLaunching OnActivated

打断(电话,上滑下滑,下滑上滑) Home键双击列出不活跃的应用程序,然后重新选择我们的应用程序:

OnResignActivation OnActivated

Home键双击列出非活动应用程序,选择另一个应用程序,然后重新启动我们的应用程序: 单按Home键,然后重新启动: 锁定(开/关按钮),然后解锁:

OnResignActivation DidEnterBackground WillEnterForeground OnActivated

双击Home键,并终止我们的应用程序:(随后重新启动是第一种情况)

OnResignActivation DidEnterBackground DidEnterBackground(仅限iOS 7 ?)

是的,DidEnterBackground在iOS7设备上被调用了两次。两次UIApplication的状态都是Background。但是,iOS 8模拟器没有。这需要在iOS 8设备上进行测试。我拿到答案后会更新的,或者其他人可以确认。