您的位置:首页 > 移动开发

关于App进入background状态

2014-05-23 11:55 218 查看
鉴于苹果对IOS系统的封闭政策,让我们的APP在进入background状态能做的事情非常有限。一般应用在进入background状态后只有几秒的时间留给用户进行一些清理和数据保存的时间。App立即就被系统挂起(当然可以理解是用户也不会让你的APP在背后背着我干一些不知道的事情耗费电量和手机流量,手机电量已经成为智能手机的软肋,一般现在是一天一充(android手机),苹果手机当然好一些,毕竟别个的限制不是毫无理由的和效果。)因此一般的应用在
- (void)applicationDidEnterBackground:(UIApplication *)application方法里面进行一些资源的释放和简单数据的保存(如状态,用户数据等),必须是轻量级的毕竟时间有限,不能做过多的任务。当然苹果也不是没有考虑到一些特殊情况的存在。如果你的应用硬是要在后台进行一些重量的任务要做,ok,可以但是时间是有限的,不是无限的哦,在IOS7之前这个时间是10分钟左右,在IOS7后这个时间缩短到3分钟。并且你必须要告知系统你进入后台还有一些长任务要做。这当然就是要进些一些设置。勾选你需要进行的一些操作。

还没完,你必须要在你的任务完成后,告诉系统你已经做完工作了,ok,系统可以把你的应用挂起了,苹果设计的还是很科学的。即使你完成了后,不告诉系统你做完了,系统也会在指定的时间过后挂起你的应用,ok,不会通知你的。当然我们可以使用application.backgroundTimeRemaining来知道我们还有多少时间可以用。block块会在app允许指定的时间过后强制关闭你的任务。

__block
UIBackgroundTaskIdentifier 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.
//UIBackgroundTaskInvalid
NSLog(@"Starting background task with %0.1f seconds remaining", application.backgroundTimeRemaining);
[NSThread
sleepForTimeInterval:600];
NSLog(@"Finishing background task with %0.1f seconds remaining",application.backgroundTimeRemaining);
//告诉系统我们完成了
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
对于音乐应用来说。对不起,这个就需要在后台运行,用户也认可,所以这类应用你可以在后台一直运行。你也默认了耗电就耗电了吧。
对与location update的情况,我们的应用在进入后台后也应该是会挂起的,只不过你向系统注册了类似的通知,让操作系统帮你monitor用户的位置update,当用户的位置change,ok,操作系统会唤起你的应用,让你有一定的时间来处理这个位置变化的事件。等你处理完毕后系统再次挂起你的应用。这样设计也是合理的。一切在我的掌握下才是最安全和放心的。
其他的情形应该也是类似的情况,系统不会让你的应用一直在后台运行,这会违背苹果的设计初衷。最后膜拜一下苹果。
具体可以参考每种情况的实例:
http://www.raywenderlich.com/29948/backgrounding-for-ios
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐