iOS不是真正的多任务系统,在用户按下Home按钮后,所有应用程序都会进入后台状态,并且大部分都会迅速进入暂停状态,应用程序的所有工作内存都在RAM中,在暂停时它完全不执行。因此,切换回这样的应用程序非常快。但是如果系统需要更多的内存给当前处于活动状态的应用程序,就有可能终结暂停状态的应用程序,它们的内存也将被释放。
一方面,应用程序在进入后台状态时,需要释放一些资源,使自身的暂停快照更小,从而减少从RAM中清除的风险,另一方面,为了避免被终结而丢失用户的数据,需要在用户离开时保存他们的进度信息,这些工作,需要在5秒钟内完成,不然会被系统认定有异常被强制退出。可能通过接收应用程序发送的通知(UIApplicationDidEnterBackgroundNotification)来触发处理,如果在处理代码中加上下面这条语句则必然会导致异常退出:
- [NSThread sleepForTimeInterval:10];
- -(void)applicationDidEnterBackground{
- NSLog(@"%@",NSStringFromSelector(_cmd));
- //得到当前应用程序的UIApplication对象
- UIApplication *app = [UIApplication sharedApplication];
- //一个后台任务标识符
- UIBackgroundTaskIdentifier taskID;
- taskID = [app beginBackgroundTaskWithExpirationHandler:^{
- //如果系统觉得我们还是运行了太久,将执行这个程序块,并停止运行应用程序
- [app endBackgroundTask:taskID];
- }];
- //UIBackgroundTaskInvalid表示系统没有为我们提供额外的时候
- if (taskID == UIBackgroundTaskInvalid) {
- NSLog(@"Failed to start background task!");
- return;
- }
- NSLog(@"Starting background task with %f seconds remaining", app.backgroundTimeRemaining);
- [NSThread sleepForTimeInterval:10];
- NSLog(@"Finishing background task with %f seconds remaining",app.backgroundTimeRemaining);
- //告诉系统我们完成了
- [app endBackgroundTask:taskID];
- }