导航

ios生命周期整理

Posted on 2012-07-16 17:02  蝈蝈俊  阅读(985)  评论(0编辑  收藏  举报

ios App states  应用的五种状态

State 描述
 Not running     

 

       应用没有被启动;或者应用正在运行但是途中被系统终止了。

 Inactive

 

       应用在前台运行,但是还不能接收事件(当时或许正在执行其他代码);一个应用通常只是很短时间停留在这个状态,很快它将切换到一个不同的状态;
       唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。 

 Active

 

       应用在前台运行,并能接收事件;这是前台应用的正常状态;

 Background 

 

       应用正在后台执行;大多数应用进入这种状态的时间很短暂;一个应用如何请求了额外的执行时间,可以保持这个状态一段时间;
       直接启动应用进入后台也是进入的这个状态;如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态。比如没有界面的应用。注此处并不特指没有界面的应用,其实也可以是有界面的应用,只是如果要直接进入background状态的话,该应用界面不会被显示。没有权限使用某个应用,或者企业级应用签名过期,或者开发测试应用签名过期都会是这样的情况。

 Suspended

 

       应用在后台,不执行;应用仍在内存中,但是不执行;这种状态是自动进入的,不会收到任何通知;当内存过低时,系统会清除这个状态的应用。

 

这几种状态的装换流程图如下:

注意:

1、运行在ios3.2或更早版本操作系统上的应用并不进入 background 和 suspended 状态, 另外一些即使运行在 ios 4或更高版本的应用,由于不支持多任务或后台执行,也不会进入background和suspended状态。相应的这些应用在前台运行状态离开时就会直接被终止。

状态变化时,我们可以通过继承下面方法来响应状态的转换。

方法名简介
application:didFinishLaunchingWithOptions   这是程序启动时调用的函数。可以在此方法中加入初始化相关的代码。
applicationDidBecomeActive  应用在准备进入前台运行时执行的函数。(当应用从启动到前台,或从后台转入前台都会调用此方法)
applicationWillResignActive  应用当前正要从前台运行状态离开时执行的函数。
applicationDidEnterBackground  此时应用处在background状态,并且没有执行任何代码,未来将被挂起进入suspended状态。
applicationWillEnterForeground  当前应用正从后台移入前台运行状态,但是当前还没有到Active状态时执行的函数。
applicationWillTerminate  当前应用即将被终止,在终止前调用的函数。如果应用当前处在suspended状态,此方法不会被调用。

 

关于main函数,UIApplication类和UIApplication代理类

每一个iPhone程序都包含一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])

{

    @autoreleasepool {

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

    }

}

在main函数中UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));对UIApplication对象进行了初始化,这个对象是隐含的,这个方法除了argc 和 argv 参数外,另外这个函数还有两个字符串参数来识别UI Application类和UI Application代理类,

第一个参数为nil就默认把UI Application类作为缺省值进行初始化,可以在这里不填nil而是使用自己定义的UI Application子类。

至于第二个参数,这里有了UI Application对象怎么又出来一个UI Application代理类对象呢?这里需要说明UI Application对象说是管理整个程序的生命周期其实它是什么具体的事情都不干,它只负责监听事件当需要做实际工作的时候就交给UI Application代理类去做,UI Application相当于传令官负责只把命令传达给UI Application代理类这个士兵,然后由这个士兵真正去冲锋陷阵,所以需要给UI Application对象设置代理类。

 

两种启动的流程:

最常见的应用启动后,进入前台的流程

应用启动后进入后台运行状态

 

 

   为了在程序中确定你的程序是进入到了foreground还是background,你可以在application:didFinishLaunchingWithOptions:   方法中检测UIApplication类对象的applicationState属性,如果应用进入到了foreground,则属性值为UIApplicationStateInactive,如果进入到了background,则为UIApplicationStateBackground。

检测示例代码:

  UIApplicationState state = [UIApplication sharedApplication].applicationState;

  return (state==UIApplicationStateActive || state==UIApplicationStateInactive );

 

 

注意点一:应用启动方式:

两种其中方式:点击应用图标或者从其他应用启动本应用(URL方式)

从其他应用启动本应用方式比较常见的:

  • 调用Google地图
  • 调用邮件客户端
  • 拨号
  • 调用短信
  • 调用浏览器
  • 调用应用商店
  • 当然我们也可以直接在safari浏览器中输入对应URL来启动应用; 

http://hi.baidu.com/qmiao128/blog/item/7c83d2ee6f36f0362cf53445.html

如果应用是通过URL启动,且之前应用没有启动,则会是下面的流程:

 

如果应用是URL方式启动,且之前一直在内存中,则是下面的流程启动:

 

响应中断

当一个基于警告的中断(诸如电话来电)发生时,应用会暂时从active状态切换到Inactive状态,以给系统提供机会提示用户,让用户决定如何处理。在用户决定如何处理此中断警告之前,应用将一直处于Inactive状态。 在用户做出选择后,当前应用或者回到active状态继续运行,或者直接切换到background状态以让位于其它的应用运行。此种情况下,应用执行流程如下图所示:

 

 

切向后台 background 状态

当用户按下"Home"键或者系统启动另外一个应用时,前台foreground应用首先切换到Inactive状态,然后切换到Background状态。

 

 

 

应用从后台返回前台:

如果应用曾被移入后台,相应的任务被停止,则此时返回前台时可以重启任务继续执行。

 

 

 

参考资料:

ios App States and Multitasking

这篇文章的中文版
http://linwwwei.iteye.com/blog/1434360 

多线程的ios生命周期
http://www.cocoanetics.com/files/UIApplicationDelegate5.pdf

Understanding iOS 4 Backgrounding and Delegate Messaging
http://www.cocoanetics.com/2010/07/understanding-ios-4-backgrounding-and-delegate-messaging/

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