iOS app的生命周期

App状态的代理事件

新建一个Signle View Application后,系统会自动创建AppDelegate文件,系统默认提供的方法表示了App不同的运行状态.

application:willFinishLaunchingWithOptions

在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

application:didFinishLaunchingWithOptions

表示App将从未运行状态进入运行状态,用于对App的初始化操作.

applicationDidBecomeActive

在application:didFinishLaunchingWithOptions:之后调用,表示应用进入active状态,在applicationWillResignActive调用后App又回到active状态时也会调用.

applicationWillResignActive

当某一操作阻塞App界面时会调用,如按Home键回到键入主界面,划出通知栏或者设置,临时的电话和通知,支持多任务的iPad进行侧边栏滑动时等情况下都会调用,使得App进入inavtive状态,往往操作结束后会调用applicationDidBecomeActive,使得App回到active状态.

applicationDidEnterBackground

在App进入后台后调用,之前肯定会调用applicationWillResignActive方法.允许执行短时间 的任务代码如清理内存

applicationWillEnterForeground

当App将从后台回到前台时调用,之后肯定调用applicationDidBecomeActive方法表示程序进入active状态,但App第一次启动时不是从后台启动,所以首次加载时不会调用此方法.

applicationWillTerminate

当App将要被系统杀死时调用,通常用来对App进行清理工作,释放资源,保存数据等等,所执行的操作官方推荐最多耗时5s左右的事件来完成和返回,若时间过长系统杀死应用时会将使操作失败.其调用时机比较特殊,如果运行的App直接退出(非进入后台),会调用;若应用是从中断状态(此状态期间App无法接收任何事件)被系统退出,则不会被调用.

注意点

iOS8中,App会在根控制器初始化后调用viewDidAppear方法之后才会调用applicationDidBecomeActive,对于App启动的事件顺序为

application:didFinishLaunchingWithOptions:

⬇️viewDidLoad

⬇️viewWillAppear

⬇️viewDidAppear

⬇️applicationDidBecomeActive

而在iOS7和9中,App在调用applicationDidBecomeActive方法后才会调用根控制器的viewDidAppear,其调用顺序为

application:didFinishLaunchingWithOptions:

⬇️viewDidLoad

⬇️viewWillAppear

⬇️applicationDidBecomeActive

⬇️viewDidAppear

iOS应用生命周期

作为应用程序的委托对象,AppDelegate类在应用生命周期的不同阶段会回调不同的方法。

下面简要介绍一下iOS应用的5种状态:

Not Running(非运行状态):应用没有运行或被系统终止运行;

Inactive(前台非活跃状态):应用正式进入前台状态,但是还没有接受事件处理;

Active(前台活跃状态):应用进入前台状态,能接受事件并且进行处理;

Background(后台状态):应用进入后台之后,依然能够执行代码。如果有可以执行的代码,就会执行,如果没有可执行的代码或者将可执行的代码执行完毕,应用会马上进入挂起状态;

Suspended(挂起状态):被挂起的应用进入一种“休眠”状态,不能执行任何代码。当手机系统内存不足时,应用会被终止。

方法:- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

说明:应用启动并进行初始化时会调用该方法并发出通知。这个阶段会实例化跟试图控制器。

本地通知:UIApplicationDidFinishLaunchingNotification

方法:- (void)applicationDidBecomeActive:(UIApplication*)application

说明:应用进入前台并处于活跃状态时调用该方法并发出通知。这个阶段可以恢复UI的状态。

本地通知:UIApplicationDidBecomeActiveNotification

方法:- (void)applicationWillResignActive:(UIApplication*)application

说明:应用从活跃状态进入到非活跃状态时调用该方法并发出通知。这个阶段可以保存UI的状态。

本地通知:UIApplicationWillResignActiveNotification

方法:- (void)applicationDidEnterBackground:(UIApplication*)application

说明:应用进入后台是调用该方法并发送通知。这个阶段可以保存用户数据,释放一些数据库资源等。

本地通知:UIApplicationDidEnterBackgroundNotification

方法:- (void)applicationWillEnterForeground:(UIApplication*)application

说明:应用进入到前台,但是还没有处于活跃状态是调用该方法并发出通知。这个阶段可以恢复用户数据。

本地通知:UIApplicationWillEnterForegroundNotification

方法:- (void)applicationWillTerminate:(UIApplication*)application

说明:应用被终止时调用该方法并发出通知,内存清除时除外。这个阶段会释放一些资源,也可以保存用户数据。

本地通知:UIApplicationWillTerminateNotification

非运行状态--应用启动场景

场景描述:用户点击应用图标,可能是第一次启动,也可能是应用终止后重新启动。共经历两个阶段3个状态

Not running->Inactive->Active

Not running->Inactive阶段。调用application:disFinishLaunchingWithOptions:方法,发出UIApplicationDidFinishLaunchingNotification通知。

Inactive->Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。


点击Home键--应用退出场景

场景描述:应用处于运行状态(即Active状态)时,点击Home键或者有其他的应用导致当前应用终端。

状态跃迁过程分两种情况:

可以在后台运行或者挂起;

不可以在后台运行或者挂起。

对于第一种情况:共经历3个阶段4个状态

Active->Inactive->Background->Suspended

Active->Inactive阶段。调用applicationWillResignActive:方法,发出UIApplicationWillResignActiveNotification通知。

Inactive->Background阶段。应用从非活动状态进入到后台。

Background->Suspended阶段。调用applicationDidEnterBackground:方法,发出UIApplicationDidEnterBackgroundNotification通知。


对于第二种情况:共经历4个阶段5个状态

Active->Inactive->Background->Suspended->Not running

Active->Inactive阶段。应用由活动状态转为非活动状态。

Inactive->Background阶段。应用从非活动状态进入到后台。

Background->Suspended阶段。调用applicationDidEnterBackground:方法,发出UIApplicationDidEnterBackgroundNotification通知。

Suspended->Not running阶段。调用applicationWillTerminate:方法,发出UIApplicationWillTerminateNotification通知。


挂起重新运行场景

场景描述:挂起状态的应用重新运行。共经历3个阶段4个状态

Suspended->Background->Inactive->Active

Suspended->Background阶段。应用从挂起状态进入后台。

Background->Inactive阶段。调用applicationWillEnterForeground:方法,发出UIApplicationWillEnterForegroundNotification通知。

Inactive->Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。


方法

本地通知

说明

application:didFinishLaunchingWithOptions:

UIApplicationDidFinishLaunchingNotification

应用启动并进行初始化时会调用该方法并发出通知。这个阶段会实例化根视图控制器

applicationDidBecomeActive:

UIApplicationDidBecomeActiveNotification

应用进入前台并处于活动状态时调用该方法并发出通知。这个阶段可以恢复UI状态(例如游戏状态)

applicationWillResignActive:

UIApplicationWillResignActiveNotification

应用从活动态进入非活动态时调用该方法并发出通知。这个阶段可以保存UI的状态(例如游戏状态)

applicationDidEnterBackground:

UIApplicationDidEnterBackgroundNotification

应用进入后台时调用该方法并发出通知,这个阶段可以保存用户数据,释放一些资源(一些可重新加载的图片等资源)

applicationWillEnterForeground:

UIApplicationWillEnterForegroundNotification

应用进入前台,但是还没有处于活动状态时调用该方法并发出通知。这个阶段可以恢复用户数据

applicationWillTerminate:

UIApplicationTerminateNotification

应用被终止时调用该方法并发出通知。这个阶段释放一些资源,也可以保存用户数据

iOS的应用程序主要由未运行、未激活、激活、后台和挂起这五个状态组成,每个状态具体的描述如下:

(1)**未运行(Not Running)**:程序未启动

(2)**未激活(Inactive)**:程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态

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

(4)**后台(Backgroud)**:程序在后台而且能执行代码,大多数程序进入这个状态后会在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态

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

AppDelegate回调函数

(1)通知进程已启动但还未进入到状态保存

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

(2)通知启动完成程序准备开始运行

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

(3)当应用程序将要进入非活动状态,在此期间应用程序不接收消息或事件,如电话来了

- (void)applicationWillResignActive:(UIApplication *)application

(4)当应用程序进入到活动状态调用

- (void)applicationDidBecomeActive:(UIApplication *)application

(5)当程序进入到后台时被调用,

- (void)applicationDidEnterBackground:(UIApplication *)application

(6)当应用程序将要从后台进入到前台的时候调用

- (void)applicationWillEnterForeground:(UIApplication *)application

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345