作为一个iOS开发者,生命周期是我们无时无刻不在打交道,却又被大多数人忽视的一个东西。这篇文章我把我所了解的所有生命周期,都做一个详细的介绍,希望对大家有帮助。
一、App的生命周期
1.App的状态
- Not Running(未运行):App没有启动。
- Inactive(未激活):App在前台运行,但是没有接收到事件。当我们的App打开但是没有任何操作(此处的操作不光指手指的操作,还包括代码层面)的时候就处在此状态。
- Active(激活):App处于前台,并且接收了事件,大多数时候App正常运行时就是处于这个状态。
- Background(后台):App在后台但是能够执行代码,一般情况下App退到后台后会在此状态下停留5-30秒,之后会进入到下面的挂起状态Suspended,有的程序经过特殊请求后可以长期的处于这一状态(如高德地图)。
- Suspended(挂起):App进入后台,并且不能执行代码,大多数情况下我们退出App(不杀死)就处于此状态。此时App还是停留在系统的内存中的,当内存过低时,App可能会被系统清理掉,此时我们再此打开App时就是重新打开的。
2.App的生命周期函数
/// App将要启动
/// @param application App对象
/// @param launchOptions 启动参数
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"willFinishLaunchingWithOptions - 将要启动");
return YES;
}
/// App完成启动(有返回值)
/// @param application App对象
/// @param launchOptions 启动参数
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"didFinishLaunchingWithOptions - 完成启动(有返回值)");
return YES;
}
/// App完成启动(无返回值)
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSLog(@"applicationDidFinishLaunching - 完成启动(无返回值)");
}
/// App完成激活
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"DidBecomeActive - 完成激活");
}
/// App将要注销激活
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"WillResignActive - 将要注销激活");
}
/// App完成进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"DidEnterBackground - 完成进入后台");
}
/// App将要进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"WillEnterForeground - 将要进入前台");
}
/// App将要终止
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"WillTerminate - 将要终止");
}
applicationDidFinishLaunching 和 didFinishLaunchingWithOptions 这两个都是App完成启动的函数,当两者都写时,执行后者
3.App生命周期的详细说明(依次执行的函数)
启动(未运行 - 激活) :
willFinishLaunchingWithOptions
didFinishLaunchingWithOptions
DidBecomeActive
进入后台(激活 - 后台) :
WillResignActive 进入后台调用瞬间
DidEnterBackground 已经完全进入后台,iPhone回到桌面
进入前台(后台/多任务 - 激活) :
WillEnterForeground App激活瞬间的展示动画
DidBecomeActive 已经完全进入前台,App的画面完全展示
进入多任务再进入前台(激活 - 多任务 - 激活) :
WillResignActive 激活 - 多任务
DidBecomeActive 多任务 - 激活
PS 注意这种情况下,从多任务到激活状态,不会调用WillEnterForeground,因为此时App是还在前台的,虽然画面是多任务
杀死App(多任务 - 终止) :
DidEnterBackground
WillTerminate