App的不同状态

一:App的不同状态

对于iOS app 来说,知道app当前的状态是至关重要的,因为iOS对系统资源有着相当严格的限制,app 在不同的状态下可执行的操作也是不同的。在当程序处于后台时,系统对app所能执行的操作做了严格的限制,以提高电池的使用时间和正在运行程序的用户体验。当在前后台切换app时,系统会发出相应的通知,在这些通知中可以改变app的操作。

当你实现程序代码时,应该遵循下面这些建议:

1.(必须)当发生状态转换时进行恰当的响应处理,如果不进行处理操作可能会导致数据的丢失和不好的用户体验。(具体参考一下 1的内容)

2.(必须)当app转入后台时,确保app所执行的操作是正确地被循序的操作(后台允许5中操作,详细见下面)

3.(建议)注册任何你需要的报告系统发生改变的通知。当app被挂起时,系统会把重要的通知放入队列,当再次执行时再分配这些通知,app应该使用这些通知来实现流畅的从后台到前台的转化。

app的几种状态:

not running:没有启动或启动后被系统结束。

Inactive:系统在前台执行但不接受任何的操作和处理,app一般短暂的处于这个状态然后转向别的状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

Active:app在前台执行并且接受操作,这是前台app的一般状态。

Background:app进入后台并且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。然而,对于请求额外的执行时间的应用,会在此状态保持更长一段时间。另外,如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态。比如没有界面的应用。注此处并不特指没有界面的应用,其实也可以是有界面的应用,只是如果要直接进入background状态的话,该应用界面不会被显示。

Suspended:app在后台,并且已停止执行代码。系统自动的将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处于Suspended状态的应用清除出内存为正在前台运行的应用提供足够的内存。

app的状态


当app发生状态变化时都伴随着程序代理函数的调用,这些方法调用就是我们响应程序状态改变的最佳时机。

application:willFinishLaunchingWithOptions: 即将启动时调用

application:didFinishLaunchingWithOptions:这些代码允许你在程序显示给用户之前执行一些最后的初始化工作

applicationDidBecomeActive: app成为前台运行程序时调用

applicationWillResignActive:你的程序正过渡远离作为前台应用程序。使用此方法来把你的应用程序在一个静止的状态。

applicationDidEnterBackground:app 进入后台运行,并且随时可能被挂起

applicationWillEnterForeground:app 即将作为前台程序运行程序。

applicationWillTerminate:app 当前应用即将被终止,在终止前调用的函数。如果应用当前处在suspended,此方法不会被调用。

常见的状态转换:

状态之间是可以相互转换的,下面简述几种常见的方式。

当一个 App 在非运行状态时,用户可以通过点击 App 的 Icon 或者 App 的通知来打开一个 App。

需要注意的是,即使 silent 通知,在这种状态下也是无法唤醒 App 的。

然后 App 进入到活跃状态。当用户在使用 App 的过程中,会发生一些事件,然后 App 会进入非活跃状态。比如:

收到一条短信、来电时。

收到一个到期的提醒事项时。

收到一个通知,并且该通知是属于那种弹出模式时。

用户双击 Home 键,进入到 App 切换界面。

用户一般不会在这个状态下停留很久的时间,当阻碍 App 成为用户第一焦点的其他消失或被用户处理后,App 马上恢复到活跃状态。

用户摁下 Home 键或者切换到别的 App 时,App 将进入到后台运行状态,在这种状态下,只能在有限的时间内做一些简单的工作,然后 App 将会休眠,进入到暂停状态。

在暂停状态下,App 是什么都干不了的,只能等待用户主动唤醒或者 silent 通知。

休眠的 App 在收到 silent 通知时,将会进入后台状态,又可以在有限的时间内做一些工作。

如果使用新闻类 App ,或者系统的邮箱服务时,可以发现,有时候 App 明明没有被打开过,但是在打开时,内容已经做了更新。

这里就用到了 silent 推送,App 接收到 silent 推送然后进入后台运行模式,做网络请求,得到数据,然后更新 model。这样子用户在下次打开 App 时,将会看到已经更新好的数据,而不是再去做网络请求,这样子很好的提升了用户体验。

当 App 在休眠状态太久,并且更多的 App 进入到休眠状态时,系统的内容将不够用,因为 App 在休眠时,为了能够快速的将其激活,是将其放在内存中的。

这样子,用户就感觉好像使用的 App 没有被关闭,一直在运行。

内存不够用时,休眠时间比较长的 App 会被清退出内存,进入到非运行状态。


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

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

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

@autoreleasepool {

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

}

}

这句代码UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))的作用是:初始化一个UIApplication对象。这个对象是隐含的,这个方法除了argc 和 argv 系统传入的参数外,还有两个字符串参数用来识别UIApplication类和UIApplication代理类。在这里第一个参数为nil就默认把UIApplication类作为缺省值进行初始化,也可以不填nil而是使用自定义的UIApplication子类。至于第二个参数,这里有了UIApplication对象怎么又出来一个UIApplication代理类对象呢?这里需要说明UIApplication对象说是管理整个程序的生命周期的,其实它是什么具体的事情都不干,它只负责监听事件当需要做实际工作的时候就交给UIApplication代理类去做,UIApplication相当于传令官负责只把命令传达给UIApplication代理类这个士兵,然后由这个士兵真正去冲锋陷阵,所以需要给UIApplication对象设置代理类。


参考APP的状态判断

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

推荐阅读更多精彩内容