iOS APP 生命周期

 

官方文档:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW1

基本要点:

一 入口函数为main函数,一般不需要更改;

发散点:看main函数,可以注意到加上了@autoreleasepool. 实际上如果在启动子线程的时候,也需要作类似处理,以保证放入auto release pool的对象能被及时释放.

二 The Main Run Loop 主运行循环

Main Run Loop负责处理用户相关的事件。UIApplication对象在程序启动时启动main run Loop,它处理事件和更新视图的界面, 是运行在程序的主线程上的。

发散点:NSRunLoop的学习与使用.

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode

beforeDate:[NSDate dateWithTimeIntervalSinceNow:5]];

三 App States (应用程序状态)

1 Not running 未运行:程序没启动或者被系统终止;

2 Inactive 未激活:程序在前台运行,不过没有接收到事件。应用处于这个状态时,很多时候仅仅是当时正要转向另一个状态;

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

4 Background 后台:程序在后台而且能执行代码。应用程序进入这个状态多半是因为要进入Suspended状态;应用程序在从Background转向Suspended状态之前可以请求额外的时间来完成一些后台的处理。In addition, an app being launched directly into the background enters this state instead of the inactive state.

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

四 程序切换时AppDelegate收到的回调

  • application:willFinishLaunchingWithOptions: 应用程序启动时调用.一般不需要做特殊处理.

  • application:didFinishLaunchingWithOptions: 应用启动时调用,此时应用还没有展示给用户,停留在所谓的开机画面页,在这个方法中做一些必要的初始化操作,以前没有设置main story board进入的时候,是需要通过代码来alloc window并设置root view controller的. 注意在该方法中不要执行耗时操作,比如大量的IO操作等等,因为如果较长时间这个方法还没有执行完毕(测试的时候大概是30s左右),iOS会杀掉进程的.

  • applicationDidBecomeActive:应用程序进入到Active状态,意味着应用将要切换到前台.

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

  • applicationDidEnterBackground:应用程序已经进入后台状态.

  • applicationWillEnterForeground: 应用程序将要进入前台的时候调用,在这个时候还没有变成Active状态.

  • applicationWillTerminate:应用程序将要被系统终止,注意,如果应用已经是Suspended状态下这个方法不会被调用,所以如果想在程序被杀掉之前保存一些数据的话,需要注意尽量避免在这个方法中去做数据保存的事情

此外,还有方法

- (void)applicationDidFinishLaunching:(UIApplication *)application;

但是SDK文档明确说明,应该用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions替代.

五 在实际开发过程中,我们发现,在iOS 7和iOS 8 上,root view controller的viewDidLoad和

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions中的方法执行的先后顺序是不同的,也没有看到明确的文档说明,可能也和设定root view controller的方式有关。

当时遇到的问题是,在root view controller的viewDidload方法中通过addObserver来观察一个后台任务是否执行完成;而这个后台任务在didFinishLaunchingWithOptions中启动。在iOS 7 上, viewDidload会在构造root view controller之后被先执行,这样addObserver会在后台任务发送消息之前先执行,整个流程没问题;但是iOS 8上,后台任务可能都已经执行完了,postNotification已经调用过了,root view controller的viewDidLoad还没有开始调用,导致addObserver没被调用而导致bug。

所以,建议两者之间不要有强关联,不要互相依赖对方的执行。

六 在applicationDidEnterBackground时,如果还希望长时间的运行任务,可以调用下面的方法:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

NSLog(@"startBackgroundTask time out");

    // do something .....

}];

除此以外,在执行这些回调函数的时候,应该尽快的执行完毕并返回。

iOS-App生命周期的更多相关文章

  1. ios app 生命周期

    https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/The ...

  2. 图解ios程序生命周期

    图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate ...

  3. (转)深入浅出 iOS 之生命周期

    原文:http://www.cocoachina.com/applenews/devnews/2011/0817/3129.html 深入浅出 iOS 之生命周期 发布于:2011-08-17 10: ...

  4. 【转】深入浅出 iOS 之生命周期

    [iOS]深入浅出 iOS 之生命周期 深入浅出 iOS 之生命周期  http://blog.csdn.net/kesalin/article/details/6691766 罗朝辉(http:// ...

  5. 微信小程序APP生命周期

    小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...

  6. 微信APP生命周期、页面生命周期

    目录 小程序的启动流程 app生命周期 页面的生命周期 页面的生命周期(图) 小程序的启动流程 我们画一个图来表示一下,整个小程序的启动流程,我们就知道了: app生命周期 执行App()函数也就是注 ...

  7. 微信小程序-APP生命周期与运行机制

    QQ讨论群:785071190 开发微信小程序之前需要先了解微信小程序运行机制以及其生命周期,小程序APP生命周期需要先从app.js这个文件开始. 阅读过"微信小程序-代码构成" ...

  8. iOS的生命周期

    iOS应用程序一般都是由自己编写的代码和系统框架组成.系统框架提供了一些基本的infrastructure给APP来运行,而开发者则自己编写代码定制APP的外观和行为,了解iOS infrastruc ...

  9. 深入浅出 iOS 之生命周期

    转:http://blog.csdn.net/kesalin/article/details/6691766 iOS应用程序的生命周期相比 Android 应用程序的生命周期来说,没那么简明易懂,但是 ...

  10. 14 - XML、JSON、PLIST对比和APP生命周期

    XML中间的 数据表达/传输数据的语言 优点:特别强大 强大到很多平台都有基于XML的独立语言,如MXML.HTML 缺点:传输小型数据时,特别啰嗦 size / speed = time JSON ...

随机推荐

  1. ALV界面将可编辑字段值保存到内表中

    具体代码如下: data: lr_grid type ref to cl_gui_alv_grid.      data: l_valid type c.      read table gt_exc ...

  2. jsp学习--JSP运行原理,九大隐式对象和JSP常用标签

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  3. 第一个Spring demo

    参考Spring3.x企业实战 1.新建web工程chapter5,导入jar包.注意:cglib和commons-dbcp这两个包 2.设计数据库 t_login_log表结构(存放日志信息),主键 ...

  4. 数据字典和动态性能视图<五>

    数据字典和动态性能视图 介绍:数据字典是什么 数据字典是 oracle 数据库中最重要的组成部分,它提供了数据库的一些系统信息. 动态性能视图记载了例程启动后的相关信息.  数据字典 数据字典记录了 ...

  5. aix DNS 配置以及网络命令traceroute和nslookup 和 dig 命令

    DNS 域名系统 (DNS) 服务器将 IP 地址解释为其他计算机或网站的域名和地址.如果没有 DNS,您需要在 Web 浏览器中输入 IP 地址.例如,如果您未访问 DNS 并希望查看 IBM 的网 ...

  6. __slots__ 属性绑定

    s = Student() # 创建新的实例 s.name = 'Michael' # 绑定属性'name' s.age = 25 # 绑定属性'age' s.score = 99 # 绑定属性'sc ...

  7. php中英文截取无乱码 包括全角下的字符

    符合UTF-8下,如果GBK下  改为  $content .= $str[$sing].$str[$sing+1];        $sing += 3; 改为 $sing += 2; /**    ...

  8. js学习---常用的内置对象(API)小结 :

    内置对象(API): 日期 Date: getFullYear() 返回完整的4位的年份  如:2016 getMonth()    返回月份,从0开始 getDate()   返回当前月的第几天,当 ...

  9. [译]GLUT教程 - glutPostRedisplay函数

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...

  10. OpenGL(一)——入门学习

    概要 1. 为什么使用OpenGL 2. 在VS2008上搭建环境 3. 一个简单的例程 OpenGL相较于DirectX的优越性 1. 与C语言紧密结合 OpenGL命令最初就是用C语言函数来进行描 ...