iOS 多任务原理解析
如今,多任务这个有趣特性已经成功集成在设备中,我们如今使用的智能手机完全支持多任务,这其中有一个东西尤其功不可没。这就是苹果的iPhone手机。
iOS是使用广泛的令人惊叹的操作系统。在2010年之后iOS 4 变成了多任务操作系统。众所周知,当你打开一个应用程序然后退出,它仍然会保留在后台。
当然,这会导致电池的消耗,你必须手动关闭它们。其实这根本不关电池消耗的事。一些开发者在他们的博客中也提到这一点。
Fraser Speirs是Connected Flow 公司的程序员,同时是雪松英才学校(苏格兰的一所少年学校,使用iPad进行教学)IT和计算机部门的负责人。在他的文章中,他解释了关于iOS多任务的美丽的误会。
首先是关于电池消耗:这确实需要注意,但这个问题要区别对待,说出这个问题的人并不清楚真正的原因。
他进一步解释:事实上,iOS多任务栏并不是包含“所有正在运行的应用程序列表”,它仅仅是“最近使用过的应用程序列表”。用户根本没有必要自己管理iOS的后台任务。
除了一些特殊情况(我会解释),显示在多任务栏中的app当前并不处于运行状态。当你按下Home按钮,iOS将通知app退出。大部分情况下,它将退出,不再占用CPU时间(包括电池),释放内存(需要的时候恢复)。
他解释:iOS 应用程序有5个状态:
停止运行-应用程序已经终止,或者还未启动。
不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。
活动-app处于“使用中”的状态。
后台-app不再屏幕上显示,但它仍然执行代码。
挂起-app仍然驻留内存但不再执行代码。
在此,我们不讨论app的活动/不活动状态。绝大部分困惑是在app从活动状态转入后台,然后到挂起,最后到停止运行这个过程中产生的。
按下Home键时,app从活动状态转入后台,绝大部分app通常在几秒内就从后台变成了挂起。
第一个技术细节是,挂起的app仍然驻留在设备内存内。这就是为什么当你返回app时,能快速恢复它们的原因。它们并没有占用cpu时间,也不消耗电池电量。
你会想到,如果app驻留在内存,你必须想办法删除它们以便节约内存。如果你不删除它们iOS也会删除它们。如果app处于挂起状态,当你打开一个内存敏感的app,比如一个大游戏时,iOS会自动清理挂起的app,将他们变为停止运行状态。这样,它们就完全被清理出内存,当你再次点击app图标它们会重新启动。
人们容易混淆的是:所有这些都对多任务栏没有影响。多任务缆总是显示最近使用的app列表,而跟它们是否处于后台、挂起或停止运行状态无关。你应该注意到,当前处于活动状态的app并不显示在多任务栏中。
后台任务
当app被移到后台,通常几秒内就会被移到挂起状态。app能够延长这个时间,通过声明一个“后台任务”。
例如,有的app需要下载比较大的文件。比如我最爱的微博Instacast。当Instacast处于活动状态,它会开始下载新的博客。如果我点击Home键,Instacast会花5秒钟继续运行于后台状态,然后挂起。这将中断博客的下载,可能是5分钟或者更多。
iOS允许Instacast声明一个后台下载任务。这会让Instacast在我按下Home键之后仍然有额外的时间在后台运行,知道博客下载完成。app能申请的后台运行时间并不是无限的,app只能申请大约10分钟的后台运行时间,然后被iOS强行挂起。但是你无须为此担心。
无限的后台运行时间
所有的app都有5秒的后台运行时间。一些app可以请求10分钟的额外时间。有一小部分app确实需要无限的后台运行时间,iOS是允许的。
准确地说,在iOS5中,有5类app允许有无限的后台运行时间:
1. 可以在后台播放声频的app。例如Instacast在播放一个博客时。
2. 可以在后台跟踪你的位置的app。例如,TomTom导航系统,哪怕在另外一个app处于活动时,它也能发出语音提示。
3. 监听VOIP呼入的app。使用Skype时,当Skype在后台运行时,你仍然可以收到Skype来电。
4. 可以下载新内容的报刊类app。
5. 后台连续接收来自外部硬件(ExernalAccessory框架)的更新。
上面5种app在任务执行完毕时自动变成挂起状态。当Instacast停止博客播放时,它将挂起。还有一些iOS自带的app也能在后台连续运行,我们用的最多的可能是Mail程序。
无论这些app在后台运行多长时间,它们都会占用内存、CPU时间和电量。一般,你会知道你正在使用类似的app。开发者必须声明它们所需要的后台运行类别,AppStore会检查这些声明是否被滥用。
前面我说过“用户根本没有必要自己管理iOS的后台任务”。当然,如果后台运行的app崩溃并无法正常关闭时则另当别论。不过对于iOS用户而言,这并不多见。
总结
让我们回顾一下:
当有人告诉你凡是在多任务栏中的app都是当前正在运行的,它们都是占用内存或者消耗电池的——这是不对的。
当你按下Home键,app从活动状态变为后台状态并迅速转为挂起状态,此时它不 再占用CPU时间和电量。
一个app可以请求10分钟左右的后台运行时间,以完成长时任务,然后才变为挂起状态。
当内存紧张时,iOS自动移除挂起的app,将它们变为停止运行状态并回收内存。
有5类app-audio、GPS、VOIP、Newsstand(报刊栏)及accessory,以及一些内置的app(如Mail)可以无限制后台运行一直到他们的任务完成。
简单地说:你不需要管理iOS后台任务。系统会自动处理,你需要做的仅仅是写好你的audio、GPS、VOIP、Newsstand和Accessory应用。