当程序进入后台后想做一些事情应该将代码写在哪个方法里边?
2016-09-20 本文已影响112人
90后的晨仔
参考链接:
http://www.programering.com/a/MzN0gDNwATQ.html
苹果官方解释:
1、该方法是在程序将被终止的时候调用。一般用它来执行最后的清理任务,如释放共享资源,节约了用户数据和无效定时器。此方法的实现有大约五秒钟执行任何任务并返回。如果时间到期之前的方法没有返回,系统可能会完全终止进程。
2、对于不支持后台执行或者是针对iOS的3.x或更早链接的应用程序,当用户退出应用程序这个方法总是被调用。对于支持后台执行的应用程序,当用户退出应用程序,因为应用程序简单地移动到在这种情况下,背景通常不调用此方法。然而,这种方法可以在其中应用程序在后台运行的情况下被调用(不暂停)和系统需要终止它由于某种原因。
3、这本字典,我们可以知道,苹果公司表示,这样的事情:的方式让你知道它会很快被用来杀死,并从内存中完全删除。你应该使用这个方法来执行任何应用程序最后的清理工作,如资源共享的释放,保存用户数据,计时器故障,约5秒钟来执行任务,返回途中,如果方法不及时返回到故障,则该系统可能会终止该进程。
4、对于不支持后台执行或在ios3.x以及之前当用户关闭了该方法的应用这些应用,将总是被调用。在执行时的应用背景,在用户关闭时,它一般不称为应用程序,因为在这种情况下,只需移动到背景中。那么,什么时候调用此方法?当应用程序仍然在后台运行(而不是在后台暂停),但由于某种原因需要关闭它时,这种方法可能会被调用。
+++++++++++++++++++++++++++++
网上有这么一个模拟的例子:
按以下步骤进行操作:
步骤一:
在Info.plist里边设置
Application does not run in background
为 YES
步骤二:将以下代码黏贴到你的工程中就会输出下面的结果。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"%s", __PRETTY_FUNCTION__);
__block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{
if (identifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:identifier];
identifier = UIBackgroundTaskInvalid;
}
}];
dispatch_async(dispatch_get_main_queue(), ^{
for (int i=0; i <20; i++) {
NSLog(@"%d", i);
sleep(1);
}
if (identifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:identifier];
identifier = UIBackgroundTaskInvalid;
}
});
}
- (void)applicationWillTerminate:(UIApplication *)application
{
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"testKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"%s", __PRETTY_FUNCTION__);
}
显示结果显示的结果为: