当一个应用程序从后台被唤醒,你想让它准备为活动时,哪个是正确的委托来实现?
applicationwillenter前台vs applicationDidBecomeActive——有什么区别?
当应用程序将进入睡眠状态,你想让它准备清理和保存数据时,应该实现哪个委托呢?
applicationWillResignActive vs. applicationDidEnterBackground—有什么区别?
此外,我还注意到当传入短信或电话进来时,applicationWillResignActive被调用,但用户选择单击Ok并继续。我不希望我的应用程序在这些情况下采取任何行动。我只是想让它继续运行,没有任何中间清理,因为用户没有退出应用程序。所以,我认为它更有意义,只在applicationDidEnterBackground做清理工作。
我希望您能提供一些最佳实践,帮助我们选择使用哪些委托来唤醒和入睡,以及考虑像被短信/电话打断这样的事件。
谢谢
我对达诺的回答还是有点困惑,所以我做了一个小测试,以获得某些场景下的事件流,供我参考,但它可能对你也有用。这是针对那些在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设备上进行测试。我拿到答案后会更新的,或者其他人可以确认。
当唤醒,即重新启动一个应用程序(通过跳板,应用程序切换或URL) applicationwillenter前台:被调用。它只在应用准备好使用时执行一次,在被放入后台后,而applicationDidBecomeActive:可能在启动后被调用多次。这使得applicationWillEnterForeground:非常适合重新启动后只需要发生一次的设置。
applicationwillenter前台:被称为:
当应用程序重新启动
applicationDidBecomeActive之前:
applicationDidBecomeActive:被调用:
当应用程序第一次启动后应用程序:didFinishLaunchingWithOptions:
after applicationwillenter前台:如果没有URL要处理。
调用handleOpenURL。
after applicationWillResignActive:如果用户忽略中断,如电话或短信。
applicationWillResignActive:被调用:
当有电话之类的干扰时。
如果用户进行呼叫,则调用applicationDidEnterBackground。
如果用户忽略调用,则调用applicationDidBecomeActive。
当用户按下home键或切换应用程序时。
医生说你应该
暂停正在进行的任务
关闭定时器
暂停游戏
降低OpenGL帧速率
applicationDidEnterBackground:被调用:
applicationWillResignActive之后:
医生说你应该:
释放共享资源
保存用户数据
无效计时器
保存应用程序状态,以便在应用程序终止时恢复它。
禁用UI更新
您有5秒钟的时间来做需要做的事情并返回方法
如果你在5秒内没有返回,应用将被终止。
你可以用beginBackgroundTaskWithExpirationHandler请求更多的时间:
官方文件。
我对达诺的回答还是有点困惑,所以我做了一个小测试,以获得某些场景下的事件流,供我参考,但它可能对你也有用。这是针对那些在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设备上进行测试。我拿到答案后会更新的,或者其他人可以确认。
applicationwillenter前台被称为:
当应用程序重新启动(从后台到前台)
当应用程序第一次启动时,即当applicationDidFinishLaunch被调用时,该方法不会被调用,而只在来自后台时调用
applicationDidBecomeActive
applicationDidBecomeActive被调用
当应用程序在didFinishLaunching后第一次启动时
在applicationwillenter前台之后,如果没有URL要处理。
调用handleOpenURL。
在applicationWillResignActive后,如果用户忽略中断,如电话或短信。
在alertView从应用程序的任何地方消失后