ios App states 应用的五种状态
State | 描述 |
Not running |
应用没有被启动;或者应用正在运行但是途中被系统终止了。 |
Inactive |
应用在前台运行,但是还不能接收事件(当时或许正在执行其他代码);一个应用通常只是很短时间停留在这个状态,很快它将切换到一个不同的状态; |
Active |
应用在前台运行,并能接收事件;这是前台应用的正常状态; |
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