在APP进入后台时,会自动中断正在执行的任务。例如你正在下载一个文件时,不小心退出了当前屏幕(ReturnBack或按了Home键等),这时ios就会中断你正在进行的任务,这是因为iOS 系统需要保证系统流畅,不会允许后台app在不停运行代码,从而浪费大量的内存资源。对于用户来说体验十分不友好。我们可以利用ios的UIBackgroundTaskIdentifier来向系统借用一些时间,使当前正在执行的任务在进入后台时可以继续执行一段时间(该时间由系统决定,时间长短和自身设备支援有关)。
完整示例代码
//AppDelegate.m文件实现
//声明函数
@interface AppDelegate ()
@property (nonatomic, unsafe_unretained)UIBackgroundTaskIdentifier taskId;
@property (nonatomic, strong) NSTimer *timer;
@end
//APP进入后台时会调用该方法
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.taskId =[application beginBackgroundTaskWithExpirationHandler:^(void)
{
//需要停止NSTimer,结束任务
[self endTask];
}];
//可以在此获取系统留给的我们的时间
self.timer =[NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(longTimeTask:)
userInfo:nil
repeats:YES];
}
//app启动或者app从后台进入前台都会调用这个方法
- (void)applicationDidBecomeActive:(UIApplication *)application
{
//需要停止NSTimer,结束任务
[self endTask];
}
//获取系统留给的我们的时间
- (void) longTimeTask:(NSTimer *)timer
{
NSTimeInterval time =[[UIApplication sharedApplication] backgroundTimeRemaining];
NSLog(@"系统留给的我们的时间:%f",time);
}
//结束任务方法
-(void)endTask
{
if (_timer != nil||_timer.isValid)
{
[_timer invalidate];
_timer = nil;
[[UIApplication sharedApplication] endBackgroundTask:self.taskId];
self.taskId = UIBackgroundTaskInvalid;
}
}
网友评论