您的位置:首页 > 移动开发

iOS application生命周期研究、发现与总结

2013-09-13 23:51 399 查看
前言:不积跬步,无以至千里;不积小流,无以成江河!既然选择做开发,就要做到让自己满意。

今天主要研究了一下Application的生命周期,如下。

一、Application的几种状态。

1)Not running 未运行

未运行状态就是程序的初始状态,程序处于这种状态时有三种可能。

1、设备刚启动。
2、程序处于暂停状态,且在系统内存紧张时,程序被系统Kill掉。
3、程序因为错误而崩溃。

2)Inactive 不活动
一般是一种过渡的状态,或者应用在被中断(不能响应消息)时也会进入此种状态:
1、应用程序在两个其他状态之间转化会在短时间内处于此状态。
2、系统提示的打断(短信、电话、锁屏)会使应用进入此状态:
不处理短信和电话会使应用一直处在不活动状态,而锁屏后在小段时间内会进入后台。

3)Active 活动
程序在前台运行的正常状态,能够接收到事件,最普通的状态。

4)Background 后台
程序在后台运行的状态,但是大多数都不会太久,会在时间到了之后转化为暂停状态。但是也有可能通过一些方式使得程序长时间停留在后台。
按下Home键之后,所有程序都会进入后台状态。

5)Suspended 暂停(挂起)

程序在暂停时不能执行代码、但是不会被释放内存。但是当系统内存不足的情况下,暂停的程序有可能会被释放。

如图所示:



1、活动与不活动状态之间转化:应用被系统中断的情况,用户没有转向中断程序,而返回原应用。

2、活动->不活动->后台->不活动->活动:应用被系统中断,用户转向处理,此时应用进入后台,在用户处理完成任务之后再次启动应用。
3、暂停到未运行:应用因系统内存紧张被杀死。

二、 应用程序的生命周期
1)主要声明周期
在iOS中,主要是一下几个委托回调来作用着应用的生命周期。

application:didFinishLaunchingWithOptions

applicationWillResignActive

applicationDidEnterBackground

applicationWillEnterForeground

applicationDidBecomeActive

applicationWillTerminate

我们对此进行测试:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"%@",NSStringFromSelector(_cmd));
return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"%@",NSStringFromSelector(_cmd));
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"%@",NSStringFromSelector(_cmd));
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"%@",NSStringFromSelector(_cmd));
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"%@",NSStringFromSelector(_cmd));
}

- (void)applicationWillTerminate:(UIApplication *)application
{
NSLog(@"%@",NSStringFromSelector(_cmd));
}


注:NSStringFromSelector(_cmd)的作用是返回当前方法名。

让我们看看,在一下几种情况下,这几个委托方法的执行顺序。

1、启动程序:

application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

2、按下Home键:程序进入后台,很快会进入暂停状态,但是暂停状态没有可以回调的函数。

applicationWillResignActive:
applicationDidEnterBackground:

3、回到程序:

applicationWillEnterForeground:
applicationDidBecomeActive:

4、短信打断:此时程序进入了不活动状态,而不是后台。

applicationWillResignActive:

4-1如果进入编辑短信:现在才进入后台。

applicationDidEnterBackground:

4-2退出短信

[b] applicationDidBecomeActive

[/b]

5、双击Home键,强行关闭程序:

但没有任何Log信息,说明程序从暂停变为未运行状态时,没有调用applicationWillTerminate方法!

那么什么时候applicationWillTerminate会被调用呢?答案是从后台变为未运行状态时,因为此时程序有时间反应。

三、每个生命周期的职能

那么每个回调中应该执行什么操作呢?

application:didFinishLaunchingWithOptions:程序初始化。

applicationWillResignActive:暂停应用程序的显示,但不释放资源。

applicationDidEnterBackground:释放可以重新生成的资源。

注:不要在此阶段消耗太多时间(5秒),否则会被系统kill掉。(如果有太多后台的事件要处理,可以放到消息队列)

applicationWillEnterForeground:恢复在applicationDidEnterBackground释放的资源。

applicationDidBecomeActive:恢复applicationWillResignActive中的操作

**************************************************************

atany原创,转载请注明博主与博文链接,3Q


/article/7601634.html

—— by atany

**************************************************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: