[iOS]深入浅出 iOS 之生命周期

深入浅出 iOS 之生命周期  http://blog.csdn.net/kesalin/article/details/6691766

罗朝辉(http://blog.csdn.net/kesalin)

转载请注明出处

iOS应用程序的生命周期相比 Android 应用程序的生命周期来说,没那么简明易懂,但是也并不复杂。iOS应用程序的生命周期又根据系统是否支持多线程分为两种:
不支持多线程的iOS4之前的系统以及支持多线程的iOS4及其之后的系统。

iOS4 之前系统,app的生命周期图如下所示:
感谢 oliver@drobnik.com 提供如错详细的图,并以cc许可发布。

从图中我们可以看出: step 1,点击 app icon 或者从应用程序url(比如在Safari地址栏中输入应用程序url)启动应用程序。

step 2,就会进入 UIApplicationDelegate 的
- (void)applicationDidFinishLaunching:(UIApplication *)application;
或 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

step 3, 如果是从 url 启动的则先进入 UIApplicationDelegate 的
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
然后再跳转到step 4;否则直接跳转到step 4;

step 4,进入 UIApplicationDelegate 的
- (void)applicationDidBecomeActive:(UIApplication *)application;

step 5,进入应用程序主循环,这时应用程序已经是活动的了,用户可以与应用程序交互。

step 6,在 step 5 状态下,如果按住 home 键或者进行任务切换操作,然后跳转到 step 8;

step 7,在 step 5 状态下,应用程序被中断(如来电,来短信),进入 UIApplicationDelegate 的
- (void)applicationWillResignActive:(UIApplication *)application;
如果用户选择不处理继续留在当前应用程序,则回到 step 4;如果用户选择处理,则跳转到 step 8;

step 8,进入 UIApplicationDelegate 的
- (void)applicationWillTerminate:(UIApplication *)application;
当前应用程序关闭。

注:这里所说的进入,并非真正的调用该消息,只是走流程。因为 UIApplicationDelegate 的方法都是@optional的,实现了则真正执行,没有实现则什么也不做。

iOS4 及其之后的系统,app的生命周期图如下所示:

感谢 oliver@drobnik.com 提供如错详细的图,并以cc许可发布。

从图中我们可以看出,支持多线程之后,情况要复杂得多了。但总体还是有规律可循的,多了一个后台模式。
在app被中断之后,先进入后台:
- (void)applicationDidEnterBackground:(UIApplication *)application;
在app被中断后继续时,要从后台模式切换到前台:
- (void)applicationWillEnterForeground:(UIApplication *)application;

注意:iOS3.2 下构建的 app 也会进入applicationDidEnterBackground:,然后立马就关闭掉了。而iOS4.x 下构建的 app,进入applicationDidEnterBackground:后,不会立马关闭掉,而是留在后台状态。在后台状态下,无论你是通过点击 app icon还是任务切换回到前台,首先进入的是 applicationWillEnterForeground,然后才是 applicationDidBecomeActive。

当系统内存不足时,系统会强行关闭那些尚在内存中但处于后台状态的 app,以腾出足够的内存供使用。但是那些被强行关闭的程序不会调用任何UIApplicationDelegate的委托方法,只会得到一个KILL 信号。当我们长按app icon,强行关闭app,也是同样的处理过程。

在iOS4及之后的系统中,在app运行过程中接电话/查看短信,应用程序不会被关闭,它会进入后台模式。我们可以双击 home 键查看所有当前运行着的应用程序。

【转】深入浅出 iOS 之生命周期的更多相关文章

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

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

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

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

  3. 图解ios程序生命周期

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

  4. iOS的生命周期

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

  5. iOS ViewController生命周期

    ViewController是view的controller,viewController的职责主要包括管理内部各个view的加载显示与卸载,同时负责与其他ViewController的通信和协调. ...

  6. iOS视图生命周期与视图控制器关系

    iOS中视图是一个应用的重要组成部分,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻.   视图生命周期与视图控制器关系   以视图的5种状态为基础,我们来系统的了解一下 ...

  7. 【Xamarin 开发 IOS --IOS ViewController生命周期】

    ViewController ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内 ...

  8. iOS程序生命周期 AppDelegate

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

  9. iOS开发——生命周期

    为了处理好应用程序的挂起.暂停等情况下的数据保存,或对应添加所需处理,我们必须了解ios生命周期. 但是不要去背去记,做个实验就好. - (BOOL)application:(UIApplicatio ...

随机推荐

  1. 响应式下的雪碧图解决方案 - 活用background-size / background-position

    一.概述 在传统的居中布局时,我们常用background-position这个属性来进行雪碧图的定位,在减少数据量的同时,保证准确定位.在移动端使用越来越重的现在,以往的传统定位,已经无法达到目的, ...

  2. JS常用时间处理方法

    这里会扩展一些JS常用时间处理方法,内置时间对象的方法不再赘述 -- 传送门:http://www.w3school.com.cn/js/jsref_obj_date.asp 时间格式化 -- 转换为 ...

  3. js中json对象数组按对象属性排序

    在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据json中某一项进行数组的排序. 例如返回的数据结构大概是这样: { result:[ {id:,name:'中国银 ...

  4. Golang Socket编程

    Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时, ...

  5. api拆分(数据传递和接收的几种方式)

    传递方式一:对象转String 接收:String类型接收再转对象 传递方式二:Map 接收:Map 传递方式三:json(Map转json) 接收:String转Map 传递方式四:Map里放jso ...

  6. easyui多选与接收不一致解决方案

    附代码: function batchRefund(){ if(editIndex != undefined) { $('#refundList').datagrid('endEdit', editI ...

  7. WPF 用户控件嵌入网页

    WPF使用用户控件嵌入网页,直接使用WebBrowser或Frame会产生报错,报错信息如下: 1.使用WebBrowser,<WebBrowser Source="http://19 ...

  8. Redis-Map

    Redis Map 存储K-V键值对.(跟Java的Map类比) 哈希表结构: typedef struct dictht { dictEntry **table;  //哈希表数组 unsigned ...

  9. 您只能在 HTML 输出流中使用 document.write,啥意思

    JavaScript :写入到HTML输出语法 注意:只能在HTML输出中使用,如果在文档已经加载后使用(比如在函数中)  会覆盖到整个文档 <!DOCTYPE html> <htm ...

  10. bootstrap学习笔记细化(按钮)

    button:btn 圆角灰色按钮 button:btn btn-default 圆角灰色边框按钮 button:btn btn-success 绿色 button:btn btn-primary 蓝 ...