iOS中的多任务

来源:互联网 发布:淘宝店铺装修在线生成 编辑:程序博客网 时间:2024/05/23 05:07

 首先笔者给本文的主题做一个总结。在这里提到的多任务中,我们将会涉及到IOS7的后台任务(Background Task)、后台获取(Background Fetch)、推送唤醒(Remote Notifications)、后台传输(Background Transfer Service)。但是由于时间有限,本文只介绍前两部分,下一篇将会介绍剩余两类。

        我想以一个疑问开头,如果你在一个APP中按下了Home键将会发生什么?答案就是在IOS4之前,按下Home键后APP会被直接干掉,在IOS4时,苹果引入了后台和多任务,其作用用一句话来说就是按下Home键后APP可驻留于后台并执行相关操作。虽然IOS4引入了后台的 功能,但是一般的普通应用却并不能真正于后台执行自己的代码,只有少数部分经过注册后的服务可以真正在后台运行。随着后来IOS5,IOS6的推出可于后台运行的服务开始变得多了起来,开始有以下非系统应用可以运行于后台:

         后台完成某些花费时间的特定任务、后台播放音乐、位置服务、IP电话(VoIP)、Newsstand

以上提到的几类相信大家一定都非常熟悉特别是后台音乐播放,接下来进入正题。

       iOS7的多任务

       后台任务

        在IOS4时,苹果引入了 beginBackgroundTaskWithExpirationHandler,使用这个方法,可以使APP在切换到后台之后仍然能正常运行一段时间(这个时间是由系统指定的,我们可以通过 UIApplication实例的backgroundTimeRemaining来获取应用剩余的后台执行时间),其用法如下:

UIBackgroundTaskIdentifier  backgroundUpdateTask;- (void)applicationDidEnterBackground:(UIApplication *)application{         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        [self beginBackgroundUpdateTask];        NSURLResponse * response = nil;        NSError  * error = nil;        NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];        // Do something with the result        [self endBackgroundUpdateTask];    });}}- (void) beginBackgroundUpdateTask{   self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{        [self endBackgroundUpdateTask];    }];} - (void) endBackgroundUpdateTask{    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];    self.backgroundUpdateTask = UIBackgroundTaskInvalid;}

           从上面的代码可以看出我们在后台执行了一个网络请求,我们给了 beginBackgroundTaskWithExpirationHandler一个blcok,它的作用是如果在系统限制的时间内APP没有完成相关的任务,那么就将会执行的一个超时block,需要提示的一点是,如果使用了BeginBackgroundTask就一定要使用相对应的endBackgroundTask,否则APP会直接被系统干掉。

          前文曾多次提到在系统规则的时间内,那么就具体的执行时间来说,在iOS6和之前的系统中,系统在用户退出应用后,如果应用正在执行后台任务的话,系统会保持活跃状态直到后台任务完成或者是超时以后,才会进入真正的低功耗休眠状态。而在iOS7中,后台任务的处理方式发生了改变。系统将在用户锁屏后尽快让设备进入休眠状态,以节省电力,这时后台任务是被暂停的。之后在设备在特定时间进行系统应用的操作被唤醒(比如检查邮件或者接到来电等)时,之前暂停的后台任务将一起进行。就是说,系统不会专门为第三方的应用保持设备处于活动状态。

后台获取

        如果你正在使用或者使用过Iphone,你一定会知道,当你的应用被切换到后台后,它的网络会被切断,直到你重新进入应用时它才会重新被激活并重连网络获取相应消息条目并展示给用户,说实话这样的体验并不好,因为这样的话用户每次打开应用都会有一断等待获取数据的时间。而后台获取就是为了解决这个问题。使用了后台获取后,APP被允许每隔一定时间在后台获取数据,并将最新数据展示于界面。

对应用的UIApplication实例设置获取间隔,一般在应用启动的时候调用以下代码即可:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

调用了这个方法后,现在你的app已经知道启动background fetch,APP会每间隔一定时间从服务器获取一次数据(当然真实时间看苹果心情),让我们告诉它要做些什么。方法-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler将会对你有所帮助。每当执行后台获取时该方法都会被调用,并且应该被包含在AppDelegate.m文件中。以下是完整版本:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

         //在这里展示获取到数据后更新界面  

}
1 0
原创粉丝点击