iOS应用程序生命周期
App状态变化历史:
在iOS4之前的App时代,整个界面只允许一个App处于运行状态,而当某个App处于运行状态时意味着其他所有的App的活动都被终止并退出,无法接受任何事件.一个应用的状态转换只有运行、退出之间的变换.在iOS4之后的iPhone进入了多任务处理时代.也意味了当从一个应用切换到另一个应用时,系统不会马上将原来的应用终止退出,将其状态变成了suspend,而另一个应用的状态变成了running.
AppDelegate
运行一个App,应用程序会自动创建UIApplication
单例对象,并被强引用(保证不会被销毁直到App退出),其UIApplicaiton
实例的delegate
属性被赋值为AppDelegate
实例对象(其也是一个单例,也永远不会被释放直到该App退出).而AppDelegate
对象有着一系列在程序启动时的跟踪状态变化,处理从其他应用跳转、启动到此应用,或者后台运行代码的方法.
AppDelegate
做为App的根对象的主要功能:
1. 运行在启动时自己用来初始化应用的特点代码.
2. 响应App从启动,到后台,到前台,到退出时各个状态时的指定方法.
3. 负责处理接收推送通知或本地通知启动App的情况,处理手机低内存警告时的情况.
4. 负责处理应用程序的状态保存和恢复.
5. 响应由App处理的事件,而是指定控制器或视图.
6. 处理数据的存储.
应用程序的状态:
1. Not running 未运行 程序处于没启动状态
2. Inactive 未激活 程序在前台运行, 但是没有接收到任何事件, 没有事件处理的情况下程序通常停留在这个状态
3. Active 激活 程序在前台运行,并且接收到事件.
4. Background 程序在后台且能执行代码 大多数程序进入后台这个状态后会在这个状态停留一会, 然后进入Suspended(挂起状态), 而有的程序经过特殊的请求可以长期处于Background状态.
5. Suspended 挂起 程序在后台不能执行代码, 系统会自动将程序变成这个状态且不会发通知. 当挂起时, 程序还是停留在内存中的, 当系统内存不足时,系统就会把挂起的程序清除掉, 为前台程序提供更多内存
程序状态切换图:
各个程序运行状态 代理的回调方法
- (void)applicationWillResignActive:(UIApplication *)application {
// 当应用从activite状态跳转到inactive状态时, 调用该方法. 许多的暂时打断App操作都会触发该方法. (诸如: 有电话打进来时, 收到消息时, 支持多任务的iPad进行侧边栏滑动时等情况) 或者当用户停止App并且让App进入后台状态时(Inactive状态)(如按Home键回到键入主界面,划出通知栏或者设置)
// 可以通过该方法停止进行中的任务, 让定时器失效, 进制图形渲染回调方法. 游戏类App 用该方法停止游戏
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// 该方法可以用来释放共享的资源, 保存数据, 停止定时器, 保存App当前状态信息防止App在之后被销毁掉时, 丢失了信息
// 如果你的App支持后台运行, 该方法将会在用户触发停止App操作时(如按Home键), 取代 applicationWillTerminate
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// 在App从background状态跳转到active状态时该方法被执行, 在这个方法中你可以撤销任何在App进入background状态时所做的改变.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// 重启那些在App处于inactive状态时被停止的任务(或那些还未启动的), 如果App之前处于background 状态, 通常要刷新UI
}
- (void)applicationWillTerminate:(UIApplication *)application {
// App将要终止时被调用, 如果有必要可以保持一些数据, 同时也要看看方法 applicationDidEnterBackground:
}
加载应用程序进入前台:
加载应用程序进入后台:
应用返回前台运行:
应用转到后台运行:
当一个基于警告式的中断发生时,比如有电话打进来了,这是程序会临时进入inactive状态,这用户可以选择如何处理这个中断