现在的位置: 首页 > 综合 > 正文

iOS4 请求更多后台时间

2013年12月05日 ⁄ 综合 ⁄ 共 1566字 ⁄ 字号 评论关闭

iOS不是真正的多任务系统,在用户按下Home按钮后,所有应用程序都会进入后台状态,并且大部分都会迅速进入暂停状态,应用程序的所有工作内存都在RAM中,在暂停时它完全不执行。因此,切换回这样的应用程序非常快。但是如果系统需要更多的内存给当前处于活动状态的应用程序,就有可能终结暂停状态的应用程序,它们的内存也将被释放。

一方面,应用程序在进入后台状态时,需要释放一些资源,使自身的暂停快照更小,从而减少从RAM中清除的风险,另一方面,为了避免被终结而丢失用户的数据,需要在用户离开时保存他们的进度信息,这些工作,需要在5秒钟内完成,不然会被系统认定有异常被强制退出。可能通过接收应用程序发送的通知(UIApplicationDidEnterBackgroundNotification)来触发处理,如果在处理代码中加上下面这条语句则必然会导致异常退出:

 

Cpp代码  收藏代码
  1. [NSThread sleepForTimeInterval:10];  

 

 

可以通过一种方法来请求更多后台时间来避免此问题。假设接收通知而触发的处理方法是applicationDidEnterBackground:

 

Cpp代码  收藏代码
  1. - (void)applicationDidEnterBackground:(UIApplication *)application {  
  2.     NSLog(@"applicationDidEnterBackground(start):%@",[[NSDate date] description]);  
  3.       
  4.     //得到当前应用程序的UIApplication对象  
  5.     UIApplication *app = [UIApplication sharedApplication];  
  6.     //定义后台任务变量  
  7.     UIBackgroundTaskIdentifier taskId;  
  8.       
  9.     //后台任务执行超时  
  10.     taskId=[app beginBackgroundTaskWithExpirationHandler:^{  
  11.         //后台任务执行时间超过10分钟,则执行这里代码  
  12.         NSLog(@"后台任务超时退出");  
  13.         //结束任务  
  14.         [app endBackgroundTask:taskId];  
  15.         //任务结束后,不能再执行任何代码了,否则会产生异常.  
  16.     }];  
  17.       
  18.     //系统开启后台任务失败  
  19.     if (taskId==UIBackgroundTaskInvalid) {  
  20.         NSLog(@"开启后台任务失败");  
  21.         return;  
  22.     }  
  23.       
  24.     //异步执行  
  25.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  26.         //获取后台任务还可以运行的剩余时间  
  27.         double rt = app.backgroundTimeRemaining;  
  28.         while (rt>0) {  
  29.             NSLog(@"remain time: %f",rt);  
  30.             //休眠10秒  
  31.             [NSThread sleepForTimeInterval:10];  
  32.             rt = app.backgroundTimeRemaining;  
  33.         }  
  34.     });  
  35. }  

抱歉!评论已关闭.