假如应用程序正在知心文件下载或者文件传输等,当应用进入后台时,如果该任务还没有执行王成,应用转入后提啊后,该任务就会被暂停.千万不要强制在applicationDidenterBackGround:方法中直接完成改任务--因为这回导致应用进入后台花费太多时间,iOS系统可能直接从内存中删除改应用.正确的做法是,以applicationDidEnterBackground:方法为瓶盖,告诉系统进入后台后还有更多的任务需要完成,从而向系统申请更多的后台时间.在这种方式下,当我们的应用处于后台时,即使用户正在使用其他应用,只要系统还有足够的内存,我们的引用就可以保存在内存中,iOS系统会保留应用鱼腥一段时间.
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //使用默认的通知中心监听应用转入转入后台的过程 //应用转入后台时会向通知中心发送UIApplicationDidEnterBackgroundNotification //从而激发enterBack:方法 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(enterBack:) name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]]; } -(void)enterBack:(NSNotification* )notification { UIApplication * app = [UIApplication sharedApplication]; //定义一个UIBackgroundTaskIdentifier类型(本质就是NSUinteger)的变量 //改变量将作为后台任务的标识符 __block UIBackgroundTaskIdentifier backTaskId; backTaskId = [app beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"===在额外申请的10分钟内依然没有完成任务==="); //结束后台任务 [app endBackgroundTask:backTaskId]; }]; if (backTaskId == UIBackgroundTaskInvalid) { NSLog(@"===ios版本不支持后台运行,后台任务启动失败==="); return; } //将代码块以异步方式提交给系统的全局并发队列 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"===额外申请的后台任务时间为:%f==",app.backgroundTimeRemaining); //其他内存清理的代码也可在此完成 for (int i = 0; i < 100; i++) { NSLog(@"下载任务完成了%d%%",i ); //暂停10秒模拟正在执行后台下载 [NSThread sleepForTimeInterval:10]; NSLog(@"===剩余的后台任务时间为:%f===",app.backgroundTimeRemaining); } //结束后台任务 [app endBackgroundTask:backTaskId]; }); }
上面程序中的第1行粗体代码调用了UIApp;ication的beginBackgroundTaskWithExpirationHandler方法请求更火的后台执行时间(默认请求10分钟),第2行粗体字代码调用了dispatch_async()方法以异步方式提交代码块,该带模块可以在后台运行较长时间,当代码块中的后台任务执行王成后,第3行粗体字代码调用了endBackgroundTask:方法结束后台任务.