对于iOS应用程序,关键是要知道你的应用程序是否正在前台或后台运行。由于系统资源在iOS设备上较为有限,一个应用程序必须在后台与前台有不同的行为。操作系统也会限制你的应用程序在后台的运行,以提高电池寿命,并提高用户与前台应用程序的体验。当应用程序在前台和后台之间切换时,操作系统将会通知您的应用程序。你可以通过这些通知来修改你的应用程序的行为。
 
当你的应用程序在前台活动时,系统会发送触摸事件给它进行处理。在UIKit的基础设施做了大部分的事件传递给你的自定义对象工作。所有您需要做的是覆盖在相应的对象的方法来处理这??些事件。对于控件,UIKit会通过处理你的触摸事件,或者其他一些有趣的事情发生时调用您的自定义代码,比如当文本字段中的值更改。
 
1、应用程序的状态
 
Not running未运行:程序没启动。
 
Inactive未激活:程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
 
Active激活:程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。
 
Backgroud后台:程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。
 
Suspended挂起:程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
2、各个程序运行状态时代理的回调
 
①告诉代理进程启动但还没进入状态保存
  1. - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. NSLog(@"①告诉代理进程启动但还没进入状态保存");
  4. return YES;
  5. }
 
②告诉代理启动基本完成程序准备开始运行
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  4. NSLog(@"②告诉代理启动基本完成程序准备开始运行");
  5. // Override point for customization after application launch.
  6. self.window.backgroundColor = [UIColor whiteColor];
  7. [self.window makeKeyAndVisible];
  8. return YES;
  9. }
 
③当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话
  1. - (void)applicationWillResignActive:(UIApplication *)application
  2. {
  3. // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
  4. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
  5. NSLog(@"③当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话");
  6. }
 
④当应用程序进入活动状态执行
  1. - (void)applicationDidBecomeActive:(UIApplication *)application
  2. {
  3. // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
  4. NSLog(@"④当应用程序进入活动状态执行");
  5. }
 
⑤当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
  1. - (void)applicationDidEnterBackground:(UIApplication *)application
  2. {
  3. // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
  4. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
  5. NSLog(@"⑤当程序被推送到后台的时候调用");
  6. [application beginBackgroundTaskWithExpirationHandler:^{
  7. NSLog(@"begin Background Task With Expiration Handler");
  8. }];
  9. }
 
⑥当程序从后台将要重新回到前台时候调用
  1. - (void)applicationWillEnterForeground:(UIApplication *)application
  2. {
  3. // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
  4. NSLog(@"⑥当程序从后台将要重新回到前台时候调用");
  5. }
 
⑦当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值
  1. - (void)applicationWillTerminate:(UIApplication *)application
  2. {
  3. // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
  4. NSLog(@"⑦当程序将要退出是被调用");
  5. }
 
⑧当程序载入后执行
  1. - (void)applicationDidFinishLaunching:(UIApplication *)application
  2. {
  3. NSLog(@"⑧当程序载入后执行");
  4. }
 
程序启动时:
 
2014-07-01 15:55:14.706 LifeCycle[5845:60b] ①告诉代理进程启动但还没进入状态保存
 
2014-07-01 15:55:14.708 LifeCycle[5845:60b] ②告诉代理启动基本完成程序准备开始运行
 
2014-07-01 15:55:14.709 LifeCycle[5845:60b] ④当应用程序进入活动状态执行
 
按下Home键返回主界面:
 
2014-07-01 15:56:11.756 LifeCycle[5845:60b] ③当应用程序将要入非活动状态执行
 
2014-07-01 15:56:11.814 LifeCycle[5845:60b] ⑤当程序被推送到后台的时候调用
 
再次打开程序:
 
2014-07-01 15:57:19.200 LifeCycle[5845:60b] ⑥当程序从后台将要重新回到前台时候调用
 
2014-07-01 15:57:19.201 LifeCycle[5845:60b] ④当应用程序进入活动状态执行
 
3、加载应用程序进入前台
4、加载应用程序进入后台
5、基于警告式响应中断
当出现这种中断时,我们需要在- (void)applicationWillResignActive:(UIApplication *)application方法中进行如下操作:
 
①停止timer 和其他周期性的任务
 
②停止任何正在运行的请求
 
③暂停视频的播放
 
④如果是游戏那就暂停它
 
⑤减少OpenGL ES的帧率
 
⑥挂起任何分发的队列和不重要的操作队列(你可以继续处理网络请求或其他时间敏感的后台任务)
 
当程序回到active状态,我们需要在- (void)applicationDidBecomeActive:(UIApplication *)application方法中重新开始上述任务。不过游戏要回到暂停状态,不能自动开始。
 
6、进入后台运行
当应用程序进入后台时,我们应该做些什么?
 
保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死。
 
释放尽可能释放的内存。
 
- (void)applicationDidEnterBackground:(UIApplication *)application方法有大概5秒的时间让你完成这些任务。如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。
 
如果还需要长时间的运行任务,可以在该方法中调用 
  1. [application beginBackgroundTaskWithExpirationHandler:^{
  2. NSLog(@"begin Background Task With Expiration Handler");
  3. }];
应用程序在后台时的内存使用:请求后台运行时间和启动线程来运行长时间运行的任务。
 
在后台时,每个应用程序都应该释放最大的内存。系统努力的保持更多的应用程序在后台同时 运行。不过当内存不足时,会终止一些挂起的程序来回收内存,那些内存最大的程序首先被终止。
 
事实上,应用程序应该的对象如果不再使用了,那就应该尽快的去掉强引用,这样编译器可以回收这些内存。如果你想缓存一些对象提升程序的性能,你可以在进入后台时,把这些对象去掉强引用。
 
下面这样的对象应该尽快的去掉强引用:
 
①图片对象
 
②你可以重新加载的 大的视频或数据文件
 
③任何没用而且可以轻易创建的对象
 
在后台时,为了减少程序占用的内存,系统会自动在回收一些系统帮助你开辟的内存。比如:
 
①系统回收Core Animation的后备存储。
 
②去掉任何系统引用的缓存图片
 
③去掉系统管理数据缓存强引用
 
7、返回前台运行
在暂停状态的应用程序必须准备处理任何排队的通知时,它返回到前台或后台执行状态。暂停的应用程序不执行任何代码,因此不能处理与方向的变化,时间的变化,偏好的变化,以及许多其他会影响应用程序的外观或状态的通知。为了确保这些更改不会丢失,系统排队许多相关的通知,并把它们传递给应用程序,只要它开始再次执行代码(无论是在前景或背景)。为了防止由偏快转为超载与它恢复时通知您的应用程序,该系统凝聚事件,并提供一个单一的通知(每个相关类型),反映了净变化,因为你的应用程序被暂停。
 
8、程序终止
 
程序只要符合以下情况之一,只要进入后台或挂起状态就会终止:
 
①iOS4.0以前的系统
 
②app是基于iOS4.0之前系统开发的。
 
③设备不支持多任务
 
④在Info.plist文件中,程序包含了 UIApplicationExitsOnSuspend  键。
 
app如果终止了,系统会调用app的代理的方法 - (void)applicationWillTerminate:(UIApplication *)application,这样可以让你可以做一些清理工作。你可以保存一些数据或app的状态。这个方法也有5秒钟的限制。超时后方法会返回程序从内存中清除。
 
注意:用户可以手工关闭应用程序。
 
9、The Main Run Loop  主运行循环
 
Main Run Loop负责处理用户相关的事件。UIApplication对象在程序启动时启动main run Loop,它处理事件和更新视图的界面。看Main Run Loop就知道,它是运行在程序的主线程上的。这样保证了接收到用户相关操作的事件是按顺序处理的。 
 
用户操作设备,相关的操作事件被系统生成并通过UIKit的指定端口分发。事件在内部排成队列,一个个的分发到Main run loop 去做处理。UIApplication对象是第一个接收到时间的对象,它决定事件如何被处理。触摸事件分发到主窗口,窗口再分发到对应出发触摸事件的View。其他的事件通过其他途径分发给其他对象变量做处理。 
 
大部分的事件可以在你的应用里分发,类似于触摸事件,远程操控事件(线控耳机等)都是由app的 responder objects 对象处理的。Responder objects 在你的app里到处都是,比如:UIApplication 对象,view对象,view controller 对象,都是resopnder objects。大部分事件的目标都指定了resopnder object,不过事件也可以传递给其他对象。比如,如果view对象不处理事件,可以传给父类view或者view controller。
 

iOS 应用程序的生命周期(转CocoaChina)的更多相关文章

  1. iOS 应用程序的生命周期

    iOS 应用程序的生命周期(网络资源总结) http://blog.csdn.net/totogo2010/article/details/8048652 http://www.cocoachina. ...

  2. [转载] iOS应用程序的生命周期

    iOS应用程序的生命周期 2015-06-23 iOS大全 (点击上方蓝字,快速关注我们) iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些 ...

  3. [ios基础]IOS应用程序的生命周期问题

    —程序的生命周期         a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程         b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...

  4. 浅析 - iOS应用程序的生命周期

    1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没有事件处理情况下程序通 ...

  5. [转]iOS 应用程序的生命周期

    OS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到 ...

  6. iOS开发-程序的生命周期

    为了更好的管理程序,了解程序的生命周期是很有必要的. 运行结果: 1.首次启动: 2015-05-26 17:33:28.362 Live[4858:214241] 程序开始 2015-05-26 1 ...

  7. iOS应用程序的生命周期

    iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有app来运行,而你提供自己编写的代码来定制app的外观 ...

  8. IOS学习1——IOS应用程序的生命周期及基本架构

    一.应用程序的状态和多任务 有时系统会从app一种状态切换另一种状态来响应系统发生的事件.例如,当用户按下home键.电话打入.或其他中断发生时,当前运行的应用程序会切换状态来响应.应用程序的状态有以 ...

  9. 墓碑机制与 iOS 应用程序的生命周期

    ① 应用程序的状态 iOS 应用程序一共有 5 种状态: Not running:应用未运行 Inactive:应用运行在 foreground 但没有接收事件 Active:应用运行在 foregr ...

随机推荐

  1. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,还是在return之后执行?

    这是一个很有趣的问题,我测试的结果是:是在return中间执行. 我在网上搜寻了一些资料,下面是参考代码: /** * */ package com.b510.test; /** * try {}里有 ...

  2. url上使用#号好不好

    这是一篇摘自百度站长工具的文章. 一般来说,url当中的#号是一个锚点的标志位,这样的url打开之后会将访问者的视线定位在指定位置上,令访问者直接看到网页中间的一段内容.自从推特流行开始,#号被附予了 ...

  3. 简单了解Flux,注意这是一个设计思想,是一个架构!!!!!

    在RN开发中,我们总是需要去更改一个组件个数据(也就是所谓的状态),我们一般是采用是在初始化的函数constror()(好像拼错了) 在这个函数里面申明我们的初始化数据(状态)eg:this.stat ...

  4. SQL Server 中的游标(cursor)

    http://www.cnblogs.com/Dlonghow/archive/2009/05/14/1456910.html 在数据库中,游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据 ...

  5. Using pg_dump restore dump file on Odoo

    pg_restore -C -d postgres db.dump

  6. php 实现qq第三方登录

    学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博文分享!

  7. SecureCRT通过console口连接思科设备

     

  8. html5:服务器事件推送(server-sent events)Asp.net

    支持 不支持IE 个人理解说明 个人理解:这种消息推送方式不太推广,原因有以下三点~~~`我怎么老是学这些自己认为不会推广的东西呢~汗 在.net中,framework4.5以上就可以由SignalR ...

  9. charles 常用设置

    一.过滤网络请求 通常情况下,我们需要对网络请求进行过滤,只监控向指定目录服务器上发送的请求.对于这种需求,我们有2种办法. 1.在主界面的中部的Filter栏中填入需要过滤出来的关键字.例如我们的服 ...

  10. [转]百度MP3音乐API接口及应用

    当你在百度去搜索一首歌时,你会发现有种更简单的方法,嘿嘿,告诉你个秘密,百度有个不公开的API http://box.zhangmen.baidu.com/x?op=12&count=1&am ...