墓碑机制与生命周期
Posted 想名真难
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了墓碑机制与生命周期相关的知识,希望对你有一定的参考价值。
应用程序的状态, ios 应用程序一共有 5 种状态:
- Not running:应用未运行
- Inactive:应用运行在 foreground 但没有接收事件
- Active:应用运行在 foreground 且正在接收事件
- Background:运行在 background 且正在执行代码, 后台播放音乐,地图定位,VoIP语音通话
- Suspended:运行在 background 但没有执行代码
注意几个关键名词与概念就行:
1.活跃内存
2.非活跃内存
3.墓碑机制
在iOS中,所有在内存里的程序都是被标记为活跃内存或者非活跃内存的。
活跃内存可以先简单理解为正在前台运行的软件以及刚退出不久的软件所占用的内存,这些数据是当前最活跃的(读写频率最高的)。
非活跃内存即是系统记录的你经常使用的软件所占用的内存,当前处理器并没有读取它们,但它们仍然被放在内存里处于“待命”状态,方便你下一次使用这些软件时处理器能直接从内存读取数据,而不必花费更多时间先从磁盘调到内存再读取。
重点在这,当iOS检测到你当前运行的软件需要更多活跃内存时(实际上软件向处理器请求更多内存),系统会选择性地释放掉后台软件占用的非活跃内存,转而提供给当前软件。如何释放是根据你的使用习惯来定,比如你经常用QQ,其次是微信。那么当前台内存不足时系统会优先释放掉微信占用的内存,若还不够则继续释放QQ所占用的内存。
可以假设,如果有个软件占用的内存大到要占满整个RAM,那么系统则会释放掉所有非活跃内存全部提供给这个软件使用。这便是为何你不用担心玩游戏什么的会因为内存不足而卡顿了,因为只要这个游戏有需要,就算是需要所有内存系统都会马上提供给你,不过你若不玩这游戏了那这些内存又会马上提供给其他程序。
这种内存释放机制是有“预见性”的,并非只在内存不足时临时释放。iOS会根据你的使用习惯等数据来分析,在你打开一个软件时立即准备足够内存供其使用,若该软件运行时又需要更多内存才会临时释放更多。iOS7甚至能根据你的使用习惯来预先加载常用软件,所以iOS用的时间越长就越顺手。(当然,记录用户使用习惯这种特性并不是只有苹果才有)
而且iOS的内存管理十分严格,任何第三方App都没有权限直接调用设备上的硬件,也就是说内存分配与释放都是处理器说了算,任何第三方软件都没有权限去占用固定内存(除非越狱),不会出现例外。这便是区别所在,iOS里所有第三方程序都不可能一直占用内存,一旦系统需要更多的活跃内存,就会强制释放后台非活跃内存提供给前台。而windows不同,一个在运行的软件你若不关闭它就会一直在内存里运行。
在iOS内,当一个软件从前台转入后台后5秒内便会完全停止运行,某些需要后台下载功能的软件在转入后台后也最多继续下载10分钟。这就是某种意义上所谓的的“伪后台”。
我们现在用着的后台功能大概就是这么个尿性。这里楼主要借用一下Windows phone里的一个名词——墓碑机制。
墓碑机制(Tombstone)也就是常说的「伪多任务」,是手机操作系统中的一个程序运行规则。
当上一个任务被迫中断时,如按下 Home 键至主界面的瞬间,系统会记录当下应用程序的状态,随后程序被冻结起来(完全挂起),就像把事件记录在墓碑上一样。
当需要恢复时,根据墓碑上的内容,将程序恢复到中断之前的状态。
这样的一种机制就是墓碑机制,墓碑机制常见于移动设备这种内存或电能资源有限的平台。
在此机制之上,苹果也开放了一个后台接口,允许应用在进入后台之后继续运行10分钟,无论亮屏还是息屏休眠都是10分钟,时间一到立马挂起。
墓碑式后台,在关闭程序时保存现场,下次启动时还原,给人一种后台的假象。
“墓碑”状态下的程序们不会占用CPU。你们也能称之为“后台挂起”,差不多那个意思。
然而如果应用很长时间没有被调到前台了,或者内存资源十分紧张,系统缺页且虚拟内存也十分紧张,那么UIApplication会代理系统告诉应用『你要被杀死了』,部分应用就会做最后的状态保存工作(application:shouldSaveApplicationState:需要返回YES并且开发者需要做适配工作),之后系统会完全关闭应用的进程并且释放所有内存,再次进入应用时如果开发者没做(国内大部分 app 都没做)上面的状态保存工作的话,这个应用就跟全新打开一样,之前编辑的文本、浏览的文章全部丢失,应用重新从 main 函数执行。
这就是为什么你长时间不用浏览器后再打开它时,你会发现页面重新加载了一次但网页并没有刷新,也是为什么iOS的后台功能需要软件的支持才能实现。iOS就是用这种方式实现的后台,同时又保证内存的。
综上所述,在iOS这样的内存管理机制下,你完全不必担心软件会因为分配到的内存不足而卡顿,因为任何软件被放在前台时都有权限向处理器要求尽量多的内存。
所以在iOS里,你完全没有必要去手动清理后台程序来释放内存,iOS会自动释放。相反iOS比你更“聪明”,它知道该释放哪些程序的内存,何时释放,释放多少,而自己手动清理内存完全是多此一举。
至于那些所谓的内存清理软件所列出的后台程序所占内存,那也并不是实际被占用的内存,多数都是那些程序所请求的内存大小。
楼主前面也说了,iOS里的软件是没有权限直接调用硬件的,那么内存清理软件又是如何实现清理内存功能的?当你使用内存清理功能时,它会一直向处理器请求尽量多的内存,处理器便尽量将后台里的内存释放出来供它使用,等它最大限度的获得了内存后,再自己释放掉自己占用的这些内存......这就完了。本质上讲,iOS的内存清理软件并不是“清理”了内存,而是先将其他软件“挤出”内存后再把内存让出来。
我们再反观内存的意义:是为了让CPU能更高效的读取数据,才将程序直接存放在内存里的。而你却秉着“让系统更快”的原则隔三差五把内存里的程序全抹掉,等你要用那些程序时系统还得先从外存调到内存然后才能开始读写,你说这是快了还是慢了?
iOS 7中,实际上APP拥有以下后台模式,无论是哪一种后台机制,均需要利用苹果给予的相应后台接口实现。新系统中,开发者可以灵活利用多种后台接口(API)实现更加智能的应用操作。
墓碑式
墓碑式的后台机制,这在iOS 4后被大量采用,也就是人们所说的伪多任务。按下Home键至主界面后,应用随即进入后台,但其被冻结,并不能进行任何操作。
智能调度后台
系统智能调度的后台,iOS 7新增的background fetch,这个后台接口在苹果WWDC 2013上有提及,其会根据用户行为自动调整达到效率最优的后台模式,能够处理不是很有时效性的信息获取。例如一些社交、新闻类的应用的后台信息更新,iOS系统便会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台获取频率和启动时长。
新闻类APP
由于拥有该接口的应用的数据后台刷新操作是统一调度的,因此系统可以在一个进程里面获得多个应用的数据,类似统一的推送机制,这样就能够最大限度地省电。不过这个方式也有一个缺点,那便是开发者不能设定数据具体什么时候更新,因此这个后台方式只能应用在一些时效性和敏感度不高的地方。
【iOS7后台机制详细解析】真后台
第四种方式便是真后台机制,但iOS的真后台与android的后台机制是不一样的,为了兼顾系统体验和统一进程管理,iOS在这上面加入了众多的限制。大致拥有以下几个后台接口模式:
1、Background Audio 后台音频
在播放音频时,即使应用退到后台,只要一直有音频在播放,那应用就可以一直在后台运行。
2、Location Services 定位服务
这是后台的定位服务,由系统进行统一管理。
3、VoIP 语音通话
一些类似 Skype 通话应用需要调用这个接口,实现后台的语音通话。
4、Newsstand 新闻推送
报刊杂志后台可以主动下载更新,保证其时效性。此后台运行的选项就是提供给报刊杂志类应用可以在后台下载及处理报刊杂志内容,而下载的过程需要使用 NewsstandKit 中的 NKAssetDownload 进行下载。需要注意的是,下载的过程中,应用可能还是会被挂起,甚至应用被退出,而 iOS 会在 Wi-Fi 环境下继续下载,直到下载完成。
5、Background Task Completion 后台任务冻结
这也就是 iOS4 上面允许后台保留 10 分钟的那个接口,iOS7 改为允许在开屏下运行 10 分钟,关屏会暂停,直到开屏后重启继续凑足 10 分钟,直到满10分钟后,这个后台就会被冻结。
6、 Remote Notification 远程推送
iOS7 新增,由统一推送通知激活后台,以往 QQ 微信之类的聊天软件接收到推送的时候都是点进去再加载数据,而这个接口允许软件接收到推送后可以直接启动后台任务。另外还支持Silent Notification(静默推送),适合实时类强的应用,但有频率限制(每小时几次)。
7、Background Transfer Service 后台数据服务
iOS7 新增,可由应用直接激活的无时间限制后台,但是功能很明确,只限于数据的上传下载这类传输服务,且只会在 WiFi 环境下才进行传输。
注意:应用被 Background Fetch、Remote Notification、Background Transfer Service 三类唤醒时,只被给予几秒钟时间来处理更新。
系统统一推送(无后台推送), 说到墓碑机制就不得不说 iOS 的系统推送机制,在应用程序进入墓碑状态后,其数据仍可通过苹果搭建的推送服务器传输,并不需要应用后台运行,这是无需后台驻留的系统级推送。
以上是关于墓碑机制与生命周期的主要内容,如果未能解决你的问题,请参考以下文章