iOS应用程序的生命周期又根据系统是否支持多线程分为两种:
不支持多线程的iOS4之前的系统以及支持多线程的iOS4及其之后的系统。
iOS4
之前系统,app的生命周期图如下所示:
从图中我们可以看出:
step
1,点击 app icon
或者从应用程序url(比如在Safari地址栏中输入应用程序url)启动应用程序。
step
2,就会进入
UIApplicationDelegate 的
- (void)
applicationDidFinishLaunching:(
UIApplication *)application;
或
- (
BOOL)application:(
UIApplication *)application
didFinishLaunchingWithOptions:(
NSDictionary*)
launchOptions;
step 3,
如果是从
url
启动的则先进入
UIApplicationDelegate 的
- (
BOOL)application:(
UIApplication *)application
handleOpenURL:(
NSURL *)
url;
然后再跳转到step
4;否则直接跳转到step
4;
step
4,进入
UIApplicationDelegate 的
- (void)
applicationDidBecomeActive:(
UIApplication *)application;
step
5,进入应用程序主循环,这时应用程序已经是活动的了,用户可以与应用程序交互。
step
6,在 step 5
状态下,如果按住 home
键或者进行任务切换操作,然后跳转到 step
8;
step
7,在 step 5
状态下,应用程序被中断(如来电,来短信),进入
UIApplicationDelegate 的
- (void)
applicationWillResignActive:(
UIApplication *)application;
如果用户选择不处理继续留在当前应用程序,则回到 step
4;如果用户选择处理,
则跳转到 step
8;
step
8,进入
UIApplicationDelegate 的
- (void)
applicationWillTerminate:(
UIApplication *)application;
当前应用程序关闭。
注:这里所说的进入,并非真正的调用该消息,只是走流程。因为
UIApplicationDelegate
的方法都是@optional的,实现了则真正执行,没有实现则什么也不做。
iOS4
及其之后的系统,app的生命周期图如下所示:
从图中我们可以看出,支持多线程之后,情况要复杂得多了。但总体还是有规律可循的,多了一个后台模式。
在app被中断之后,先进入后台:
- (void)
applicationDidEnterBackground:(
UIApplication *)application;
在app被中断后继续时,要从后台模式切换到前台:
- (void)
applicationWillEnterForeground:(
UIApplication *)application;
注意:iOS3.2
下构建的 app
也会进入applicationDidEnterBackground:
,然后立马就关闭掉了。而iOS4.x
下构建的
app,进入applicationDidEnterBackground:
后,不会立马关闭掉,而是留在后台状态。在后台状态下,无论你是通过点击 app
icon还是任务切换回到前台,首先进入的是
applicationWillEnterForeground,然后才是
applicationDidBecomeActive。
当系统内存不足时,系统会强行关闭那些尚在内存中但处于后台状态的
app,以腾出足够的内存供使用。但是那些被强行关闭的程序不会调用任何UIApplicationDelegate的委托方法,只会得到一个KILL
信号。当我们长按app
icon,强行关闭app,也是同样的处理过程。
在iOS4及之后的系统中,在app运行过程中接电话/
查看短信,应用程序不会被关闭,它会进入后台模式。我们可以双击 home
键查看所有当前运行着的应用程序。