所谓生命周期,就是指从 App 启动到关闭这一过程所发生的一系列事件。
App 的状态
Not running:未运行:程序没有启动。
Inactive:未激活:程序已启动,在前台运行,但未接收到事件。
Active:已激活:程序在前台运行,并且接收到了事件。
Background:后台:程序在后台运行,而且能执行代码,大多数程序在进入到这个状态之后,会在该状态停留一会,然后会进入到挂起状态。有的程序经过特殊的请求后可以长期处于 Background 状态。
Suspended:挂起:程序在后台,并且无法执行代码,系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
各个状态时代理的方法调用
1.告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"①告诉代理进程启动但还没进入状态保存");
return YES;
}
2.告诉代理启动基本完成程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"②告诉代理启动基本完成程序准备开始运行");
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
3.当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"③当应用程序将要入非活动状态执行");
}
4.当应用程序进入活动状态执行
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"④当应用程序进入活动状态执行");
}
5.当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"⑤当程序被推送到后台的时候调用");
[application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"begin Background Task With Expiration Handler");
}];
}
6.当程序从后台将要重新回到前台时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"⑥当程序从后台将要重新回到前台时候调用");
}
7.当程序将要退出时被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置 UIApplicationExitsOnSuspend 的键值
- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"⑦当程序将要退出是被调用");
}
8.当程序载入后执行
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
NSLog(@"⑧当程序载入后执行");
}
进入后台
当应用程序进入到后台时,该做什么呢?
保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死。
尽可能的释放的内存。
- (void)applicationDidEnterBackground:(UIApplication *)application
此方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。
在后台时,每个应用程序都应该释放最大的内存。系统努力的保持更多的应用程序在后台同时 运行。不过当内存不足时,会终止一些挂起的程序来回收内存,那些内存最大的程序首先被终止。
事实上,应用程序应该的对象如果不再使用了,那就应该尽快的去掉强引用,这样编译器可以回收这些内存。如果你想缓存一些对象提升程序的性能,你可以在进入后台时,把这些对象去掉强引用。
下面这样的对象应该尽快的去掉强引用:
1)图片对象
2)你可以重新加载的 大的视频或数据文件
3)任何没用而且可以轻易创建的对象
在后台时,为了减少程序占用的内存,系统会自动在回收一些系统帮助你开辟的内存。比如:
1)系统回收Core Animation的后备存储。
2)去掉任何系统引用的缓存图片
3)去掉系统管理数据缓存强引用
返回前台
在暂停状态的应用程序必须准备处理任何排队的通知时,它返回到前台或后台执行状态。暂停的应用程序不执行任何代码,因此不能处理与方向的变化,时间的变化,偏好的变化,以及许多其他会影响应用程序的外观或状态的通知。为了确保这些更改不会丢失,系统排队许多相关的通知,并把它们传递给应用程序,只要它开始再次执行代码(无论是在前景或背景)。为了防止由偏快转为超载与它恢复时通知您的应用程序,该系统凝聚事件,并提供一个单一的通知(每个相关类型),反映了净变化,因为你的应用程序被暂停。