iOS的应用程序的生命周期,还是程序运行在前台还是后台,应用程序各个状态的变换,对于开发者来说都很重要的。ios系统的资源是有限的,应用程序在前台和后台的状态是不一样的。在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验。

1、应用程序的状态

状态如下:

Not running 未运行 程序没启动

Inactive 未激活  程序在前台运行,不过没有接受到事件。在没有事件处理情况下程序通常停留在这个状态

Active 激活  程序在前台运行而且收到了事件,这也是前台的一个正常的模式

Backgroud 后台  程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态。有的程序经过特殊的请求后可以长期处于background状态。

Suspended 挂起  程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就会挂起的程序清除掉,为前台程序提供更多的内存。

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

告诉代理进程启动但还没进入状态保存

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

告诉代理启动基本完成程序准备开始运行

- (void)applicationWillResignActive:(UIApplication *)application

当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话。

- (void)applicationDidBecomeActive:(UIApplication *)application 

当应用程序入活动状态执行,这个刚好跟上面那个方法相反。

- (void)applicationDidEnterBackground:(UIApplication *)application

当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可。

- (void)applicationWillEnterForeground:(UIApplication *)application

当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

- (void)applicationWillTerminate:(UIApplication *)application

当程序将要退出时被调用,通常是用来保存数据和一些退出前的清理工作。这个需要设置


现在启动程序看看执行的顺序

启动程序
lifeCycle[40428:11303] willFinishLaunchingWithOptions
lifeCycle[40428:11303] didFinishLaunchingWithOptions
lifeCycle[40428:11303] applicationDidBecomeActive

按下home键

lifeCycle[40428:11303] applicationWillResignActive
lifeCycle[40428:11303] applicationDidEnterBackground

双击home键,再打开程序

lifeCycle[40428:11303] applicationWillEnterForeground
lifeCycle[40428:11303] applicationDidBecomeActive

当有这些中断时,我们的app该怎么办呢?我们应该在applicationWillResignActive:方法中:

  • 停止timer 和其他周期性的任务
  • 停止任何正在运行的请求
  • 暂停视频的播放
  • 如果是游戏那就暂停它
  • 减少OpenGL ES的帧率
  • 挂起任何分发的队列和不重要的操作队列(你可以继续处理网络请求或其他时间敏感的后台任务)。

 

applicationDidBecomeActive:

 

当应用程序进入后台时,我们应该做写什么呢?

  • 保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死,
  • 释放尽可能释放的内存
  • applicationDidEnterBackgound: 方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。如果还需要长时间的运行任务,可以调用  beginBackgroundTaskWithExpirationHandler       方法去请求后台运行时间和启动线程来运行长时间运行的任务。

 应用程序在后台时的内存使用


在后台时,每个应用程序都应该释放最大的内存。系统努力的保持更多的应用程序在后台同时 运行。不过当内存不足时,会终止一些挂起的程序来回收内存,那些内存最大的程序首先被终止。



事实上,应用程序应该的对象如果不再使用了,那就应该尽快的去掉强引用,这样编译器可以回收这些内存。如果你想缓存一些对象提升程序的性能,你可以在进入后台时,把这些对象去掉强引用。



下面这样的对象应该尽快的去掉强引用:



  • 图片对象
  • 你可以重新加载的 大的视频或数据文件
  • 任何没用而且可以轻易创建的对象



在后台时,为了减少程序占用的内存,系统会自动在回收一些系统帮助你开辟的内存。比如:



 系统回收Core Animation的后备存储。



去掉任何系统引用的缓存图片



去掉系统管理数据缓存强引用