一、先简单介绍一下iOS应用的5中状态:
(1)Not Running (非运行状态)。应用没有运行或被系统终止。
(2)Inactive (前台非活动状态)。应用正在进入前台状态,但是还不能接收事件处理。
(3)Active (前台活动状态)。应用进入前台状态,可以接收事件处理。
(4)Background (后台状态)。应用进入后台后,依然能够执行代码。如果有可执行的代码,就会执行代码,如果没有可执行的代码或者将可执行的代码执行完毕,应用马上进入挂起状态。
(5)Suspended (挂起状态)。处于挂起的应用进入一种“冷却”状态,不能执行代码。如果系统内存不够,应用会被终止。
二、在应用状态跃迁的过程中,iOS系统会回调AppDelegate中的一些方法,并发送一些通知。具体如下:
/*
应用启动并进行初始化是会调用该方法并发出通知。这个阶段会实例化根视图控制器,这也是为什么在这个方法里写一些设置跟控制器方法的原因。(当你不用Storyboard,纯代码写控制器的时候,需要在这里写一个根控制器)
发出的本地通知:UIApplicationDidFinishLaunchingNotification
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"application:didFinishLaunchingWithOptions");
return YES;
}
/*
应用进入前台并处于活动状态时调用该方法并发出通知。这个阶段可以恢复UI的状态(例如游戏状态等)
发出的本地通知:UIApplicationDidBecomeActiveNotification
*/
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"applicationDidBecomeActive");
}
/*
应用进入后台是调用该方法并发出通知。这个阶段可以保存用户数据,释放一些资源(列如释放数据库资源等)
发出的本地通知:UIApplicationDidEnterBackgroundNotification
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"applicationDidEnterBackground");
}
/*
应用进入到前台,但是还没有处于活动状态时调用该方法并发出通知。这个阶段可以恢复用户数据。
发出的本地通知:UIApplicationWillEnterForegroundNotification
*/
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"applicationWillEnterForeground");
}
/*
应用从活动状态进入到非活动状态时调用该方法并发出通知。这个阶段可以保存UI的状态(例如游戏状态等)
发出的本地通知:UIApplicationWillResignActiveNotification
*/
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"applicationWillResignActive");
}
/*
应用被终止时调用该方法并发出通知,但内存清楚时除外。这个阶段释放一些资源,也可以保存用户数据。
发出的本地通知:UIApplicationWillTerminateNotification
*/
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"applicationWillTerminate");
}
三、下面我就以一个简单APP来演示一下,更直观的看下这些方法在什么时候调用的:
(1)在Xcode运行程序:
得到这两个输出,APP在运行的时候,先调用实例化根控制器的方法,然后进入前台,处于活跃状态。
(2)在模拟器上按HOME键,模拟程序进入后台,得到下面的两个输出:
这输出可以看出,app在进入后台调需要用两个方法,一个是app从活动状态到非活动状态,然后才是进入后台的方法。
(3)点击模拟器上APP图标,把他从后台唤醒,又会得到两个输出:
先调用从后台进入前台的方法,然后才会调用进入活动状态的方法。
(4)双击HOME,模拟推掉进程
这次只有一个输出:
但是,当把APP推掉之后,会有下面两个输出:
一个完整的生命周期基本就是这样,如果想进一步了解的同学可以把代码考过去自己测试一下。