Refer: App
States and Multitasking
iOS设备的系统资源有限,所以App在前台运行和在后台运行的时候是有区别的。为了节省电池寿命和用户体验,App在后台运行的时候,有一些功能会被操作系统限制。
当App在前台运行的时候,可以处理系统发送的touch事件。UIKit基础架构已经做了大部分的工作用来把事件分发到自定义的对象上,开发者只需要重写一些相应的方法。
在App的开发过程中建议遵守的方针:
(Required)对状态的切换做出适当的相应,否则可能会造成数据丢失和糟糕的用户体验。
(Required)当App切换到后台运行模式时,要确保App调整一些行为。
(Recommended)注册所有的App状态改变的消息通知。当App挂起的时候,操作系统会把关键的消息通知加入队列,并在App恢复运行的时候分发给App。可以利用这些通知让App平滑的切换到运行状态。
(Optional)如果App要在后台做一些实际的工作,可以向操作系统请求相应的权限来继续运行。
管理App的状态切换
App有以下5种状态,操作系统运行过程中,一些中断操作例如按了HOME键,或者来电了,这时候都会切换当前运行的App的状态。
Not Running App没有被打开,或者在运行过程中被操作系统终止掉了
Inactive App在前台运行,但是暂时没有接收到任何事件。这个状态通常比较短暂,很快会被切换到另外的状态
Active App在前台运行,并且接收到事件。App通常运行在这种状态下
Background App在后台运行并执行代码,App被挂起的时候会短暂的停留在这种状态下,App可以向系统请求更长的时间保持这种状态
Suspended App切换到后台,不执行任何代码。操作系统在不做任何通知的前提下自动把App切换到这种状态。App在挂起的时候,还会驻留在内存中,当空闲内存过低的时候,操作系统可能会把该App从内存中清理掉。
App状态切换过程中,以下事件会被调用
application:willFinishLaunchingWithOptions: 应App刚打开的时候调用
application:didFinishLaunchingWithOptions: App被展示之前调用该事件作一些初始化工作
applicationDidBecomeActive: App被切换到前台状态的预处理
applicationWillResignActive: App从前台状态切换到其他状态时执行
applicationDidEnterBackground: App切换到后台,并且可能随时被挂起
applicationWillEnterForeground: App从后台切换到前台,但是还没有Active
applicationWillTerminate: App被终止,在App被挂起的时候会调用该方法