对于iOS App来说,知道当前的状态是至关重要的,因为iOS对系统资源有着相当严格的限制,app在不同的状态下可执行的操作也是不同的。在当程序处于后台时,系统对app所能执行的操作做了严格的限制,以提高电池的使用时间和正在运行程序的用户体验。当在前后台切换app时,系统会发出相应的通知,在这些通知中可以改变app的操作。
当你实现程序代码时,应该遵循下面这些建议:
1.(必须)当发生状态转换时进行恰当的响应处理,如果不进行处理操作可能会导致数据的丢失和不好的用户体验。
2.(必须)当app转入后台时,确保app所执行的操作是正确地被循序的操作(后台允许5中操作,详细见下面)
3.(建议)注册任何你需要的报告系统发生改变的通知。当app被挂起时,系统会把重要的通知放入队列,当再次执行时再分配这些通知,app应该使用这些通知来实现流畅的从后台到前台的转化。
app的几种状态:
1 | not running:没有启动或启动后被系统结束。 |
当app发生状态变化时都伴随着程序代理函数的调用,这些方法调用就是我们响应程序状态改变的最佳时机。
1 | application:willFinishLaunchingWithOptions: 即将启动时调用 |
常见的状态转换:
状态之间是可以相互转换的,下面简述几种常见的方式。
当一个App在非运行状态时,用户可以通过点击App的Icon或者App的通知来打开。
然后 App 进入到活跃状态。当用户在使用 App 的过程中,会发生一些事件,然后 App 会进入非活跃状态。比如:
收到一条短信、来电时。
收到一个到期的提醒事项时。
收到一个通知,并且该通知是属于那种弹出模式时。
用户双击 Home 键,进入到 App 切换界面。
用户一般不会在这个状态下停留很久的时间,当阻碍 App 成为用户第一焦点的其他消失或被用户处理后,App 马上恢复到活跃状态。
用户摁下 Home 键或者切换到别的 App 时,App 将进入到后台运行状态,在这种状态下,只能在有限的时间内做一些简单的工作,然后 App 将会休眠,进入到暂停状态。
在暂停状态下,App是什么都干不了的,只能等待用户主动唤醒或者silent通知。
休眠的 App 在收到silent通知时,将会进入后台状态,又可以在有限的时间内做一些工作。
如果使用新闻类 App ,或者系统的邮箱服务时,可以发现,有时候 App 明明没有被打开过,但是在打开时,内容已经做了更新。
这里就用到了 silent 推送,App 接收到 silent 推送然后进入后台运行模式,做网络请求,得到数据,然后更新 model。这样子用户在下次打开 App 时,将会看到已经更新好的数据,而不是再去做网络请求,这样子很好的提升了用户体验。
当 App 在休眠状态太久,并且更多的 App 进入到休眠状态时,系统的内容将不够用,因为 App 在休眠时,为了能够快速的将其激活,是将其放在内存中的。
这样子,用户就感觉好像使用的 App 没有被关闭,一直在运行。
内存不够用时,休眠时间比较长的 App 会被清退出内存,进入到非运行状态。