ios后台

来源:互联网 发布:酸碱中和滴定实验数据 编辑:程序博客网 时间:2024/05/01 22:23

挂起状态

操作系统尽可能久地保持挂起的应用程序在内存中一段时间,仅仅在空闲内存不足的时候才移除他们。保留在内存中意味着接下来你的程序会以更快的速度启动,同时,处于挂起状态意味着你的程序不会过快地消耗电量。

查看是否支持多任务

  应用程序必须准备好应对多任务机制(因此,后台执行)不可用的情况。即使运行在iOS 4及以后的系统中,设备依然可能不支持多任务机制,而且iOS 3及更早的系统不支持多任务机制。如果你的应用程序需要兼容运行在这些更早的iOS系统中,必须准备好在没有多任务的情况下运行。
     如果多任务机制的存在会影响到你的应用程序的行为,在执行相关任务前,检查UIDevice类的multitaskingSupported属性来判断系统是否支持多任务。当然,你的系统必须编译在iOS SDK 4以以上,相关代码如下所示。检查这个属性来允许你的应用程序继续运行在不支持多任务的更早的系统中。
UIDevice* device = [UIDevice currentDevice];BOOL backgroundSupported = NO;if ([device respondsToSelector:@selector(isMultitaskingSupported)])   backgroundSupported = device.multitaskingSupported;

在后台执行有限时间长度的任务

 被移到后台的应用程序可以请求一个额外的时间来完成一些重要的"最后一分钟"任务。请求后台执行时间,需要调用UIApplication类beginBackgroundTaskWithExpirationHandler: 方法。如果你的应用程序在任务执行过程中被移到后台,或者你的应用程序已经在后台,这个方法会延时应用程序的挂起。这对正在执行重要任务,如向磁盘写用户数据或者从网络服务器下载一个重要文件。
     使用beginBackgroundTaskWithExpirationHandler:方法的方式是在开始你需要保护的任务之前。每一次调用这个方法都必须对应地调用endBackgroundTask:方法来标记任务结束的地方。因为应用程序仅被给予有限的时间来完成后台任务,你必须在时间结束前调用这个方法;否则操作系统会终止你的应用程序。为了避免被终止,你也可以在开始任务时提供一个到期处理回掉并在其中调用 endBackgroundTask:方法。(你可以使用UIApplication类的backgroundTimeRemaining这个属性来知道还有多少剩余时间。)

 重要: 一个应用可以有任意数量的任务在同一时间运行。每次你开始一个任务,beginBackgroundTaskWithExpirationHandler: 方法会为该任务返回一个唯一的标示符。你必须在任务时间结束是传递同一个标示符给endBackgroundTask:方法。
下面一段代码显示了当你的应用程序被移到后台的时候如何开始一个long-running任务。在这个例子中,请求开始一个后台任务包括了一个到期处理回调来避免该任务运行太久。这个任务接下来被提交到一个异步执行的调度队列中,这样,applicationDidEnterBackground: 方法可以正常返回。这里使用blocks简化了需要维持一些变量的代码,如后台任务的标示符。这里的bgTask变量是一个类成员变量。
- (void)applicationDidEnterBackground:(UIApplication *)application{    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{        // Clean up any unfinished task business by marking where you        // stopped or ending the task outright.        [application endBackgroundTask:bgTask];        bgTask = UIBackgroundTaskInvalid;    }];     // Start the long-running task and return immediately.    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{         // Do the work associated with the task, preferably in chunks.         [application endBackgroundTask:bgTask];        bgTask = UIBackgroundTaskInvalid;    });}


原创粉丝点击