Hello, World!

App的不同状态

字数统计: 1.5k阅读时长: 5 min
2018/05/19 Share

对于iOS App来说,知道当前的状态是至关重要的,因为iOS对系统资源有着相当严格的限制,app在不同的状态下可执行的操作也是不同的。在当程序处于后台时,系统对app所能执行的操作做了严格的限制,以提高电池的使用时间和正在运行程序的用户体验。当在前后台切换app时,系统会发出相应的通知,在这些通知中可以改变app的操作。

当你实现程序代码时,应该遵循下面这些建议:

1.(必须)当发生状态转换时进行恰当的响应处理,如果不进行处理操作可能会导致数据的丢失和不好的用户体验。

2.(必须)当app转入后台时,确保app所执行的操作是正确地被循序的操作(后台允许5中操作,详细见下面)

3.(建议)注册任何你需要的报告系统发生改变的通知。当app被挂起时,系统会把重要的通知放入队列,当再次执行时再分配这些通知,app应该使用这些通知来实现流畅的从后台到前台的转化。

app的几种状态:

1
2
3
4
5
6
7
8
9
not running:没有启动或启动后被系统结束。

Inactive:系统在前台执行但不接受任何的操作和处理,app一般短暂的处于这个状态然后转向别的状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

Active:app在前台执行并且接受操作,这是前台app的一般状态。

Background:app进入后台并且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。然而,对于请求额外的执行时间的应用,会在此状态保持更长一段时间。另外,如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态。比如没有界面的应用。注此处并不特指没有界面的应用,其实也可以是有界面的应用,只是如果要直接进入background状态的话,该应用界面不会被显示。

Suspended:app在后台,并且已停止执行代码。系统自动的将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处于Suspended状态的应用清除出内存为正在前台运行的应用提供足够的内存。

App的不同状态

当app发生状态变化时都伴随着程序代理函数的调用,这些方法调用就是我们响应程序状态改变的最佳时机。

1
2
3
4
5
6
7
8
9
10
11
12
13
application:willFinishLaunchingWithOptions: 即将启动时调用

application:didFinishLaunchingWithOptions:这些代码允许你在程序显示给用户之前执行一些最后的初始化工作

applicationDidBecomeActive: app成为前台运行程序时调用

applicationWillResignActive: 你的程序正过渡远离作为前台应用程序。使用此方法来把你的应用程序在一个静止的状态。

applicationDidEnterBackground:app 进入后台运行,并且随时可能被挂起

applicationWillEnterForeground:app 即将作为前台程序运行程序。

applicationWillTerminate:app 当前应用即将被终止,在终止前调用的函数。如果应用当前处在suspended,此方法不会被调用。

常见的状态转换:

状态之间是可以相互转换的,下面简述几种常见的方式。

当一个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 会被清退出内存,进入到非运行状态。

CATALOG