1. 后台驻留
iOS 中所谓的「后台驻留」并不是指「执行中的程序」,而是「最近使用过的程序」
Apple 的知识库文章解释:
按两下主画面按钮后,显示的是「最近用过的应用程序」,所以别把它想成Mac OS X 中的Command + Tab 键所显示的切换程序列。
你可以试试看将iPhone 关机再开机,然后按两下 Home 键,应该会发现先前那些程式还是出现在那里,因为它其实是你最近使用过的程序使用记录,或像是浏览器中的浏览记录。
如果你一个一个去清除 "后台驻留" 的程序,就像是一笔一笔删除浏览记录中的项目一样,是没有太大意义的(除非你不想让其他人看到你曾经用过什么程式,或者想杀时间、太无聊了),也不会对电力或记忆体有什么帮助。
iOS 的多任务处理其实是很聪明的,系统会自动中止在背景执行的程序,在有需要时,也会将被中止的程式 suspended(挂起)(注:"中止的程式"不是指关闭程序,而是指由前台转向后台的程序,程序在后台并不真正运行,不要和关闭程序混淆了) 从内存中移除。因此,iOS 装置的使用者根本就不需要担心怎么管理这些执行中或不在执行中的程序。
所以点击两下Home之后显示的是记录,并且这些记录是有的是挂起状态,也有应用因为内存吃紧而被关闭,当你将应用划出记录的时候,其实做的是两个操作。
清除记录
完全关闭应用(关闭进程)
2.挂起
一般说来,所有程式进入背景后都还有1-5秒的执行缓冲时间(视内存压力而决定),有些程序可以要求延长到10 分钟(这些当然是由开发人员在设计与提交程式时决定和声明),因此,在你按下 Home 键后,本来的程式就会退到后台,如果它有额外的后台执行作业,超过10分钟还是会被 iOS 中止,但是,也有例外情况,某些特殊类型的程式是被容许在背景中持续执行的,像是会持续在背景播放音乐的程序、GPS 程序、VOIP 程序、Newsstand 以及周边配件附属的程序,不过只要这些程序不再执行动作,就会变成中止的程式,像是音乐拨完了、杂志下载完了。
既然是多任务你应该会在应用进入后台时做一些处理,比如暂停一些界面的定时刷新或网络请求。同时,或者你会在程序进入前台时执行一些恢复操作。
-
<p> 在你的应用的application delegate里有2个消息用于处理这些消息:</p>
- (void)applicationDidEnterBackground:(UIApplication*)application
{
//进入后台时要进行的处理
}
- (void)applicationWillEnterForeground:(UIApplication*)application
{
//进入前台时要进行的处理
}
3.延长程序挂起的时间(最多十分钟)
调用UIApplication的
eginBackgroundTaskWithExpirationHandler
方法,可以让 app 最多有10分钟的时间在后台长久运行
-
<p> 首先:声明一个实例 <p>
@interface AppDelegate ()
{
//用来保存后台运行任务的标示符
UIBackgroundTaskIdentifier backgroundTask;
}
</code> </pre>
-
<p>然后实现代码 </p>
- (void)applicationDidEnterBackground:(UIApplication *)application {
//通知系统, 我们需要后台继续执行一些逻辑
backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
//超过系统规定的后台运行时间, 则暂停后台逻辑
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}];
//判断如果申请失败了, 返回
if (backgroundTask == UIBackgroundTaskInvalid) {
NSLog(@"beginground error");
return;
}
//已经成功向系统争取了一些后台运行时间, 实现一些逻辑, 如网络处理
//some code
}
-
<p> 处理完之后挂起线程 </p>
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
4.无限后台运行
首先声明你需要的后台任务
在Info.plist中添加UIBackgroundModes键值,它包含一个或多个string的值,包括:
- audio:在后台提供声音播放功能,包括音频流和播放视频时的声音
- location:在后台可以保持用户的位置信息
- voip:在后台使用VOIP功能
<p>前面的每个value让系统知道你的应用程序应该在适当的时候被唤醒。例如,一个应用程序,开始播放音乐,然后移动到后台仍然需要执行时间,以填补音频输出缓冲区。添加audio键用来告诉系统框架,需要继续播放音频,并且可以在合适的时间间隔下回调应用程序;如果应用程序不包括此项,任何音频播放在移到后台后将停止运行。</p>
-
<p> 下面以后台播放音乐为例:</p>
<p>在Supporting Files目录下的【02 应用进入后台继续播放音乐-Info.plist】 增加一项【Required background modes】 值为【App plays audio or streams audio/video using AirPlay】<p>
// 后台播放,
AVAudioSession * session = [AVAudioSession sharedInstance];
// 类型是:播放和录音
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
// 而且要激活 音频会话
[session setActive:YES error:nil];