美文网首页iOS DevelopmentiOS Developer昊轩的个人专题
iOS(2018改)应用程序的生命周期

iOS(2018改)应用程序的生命周期

作者: Z灬昊轩 | 来源:发表于2018-03-01 14:05 被阅读137次

    iOS应用程序是指安装在苹果手机上的软件,也就是大家熟知的APP,例如:微信,QQ,支付宝等。

    iOS应用程序一般都是由自己编写的代码和系统框架组成,系统框架提供了一些基本Infrastructure给App来运行,而开发者则是自己编写定制App的外观和功能,了解iOS的Infrastructure及如何工作对编写App会有一定的帮助,当然,有很多面试官也会提问一些相关的问题。

    iOS应用生命周期

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

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

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

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

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

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

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

    以上5中状态彼此之间的关系,如下图。

    iOS应用状态图

    在应用状态有变化的过程中,iOS系统会调用AppDelegate中的一些方法,并且发送一些通知。下面汇总了一部分主要的方法和和通知。

    方法:- (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

    大家可以在AppDelegate类中的不同方法下添加输出日志的代码,通过应用启动场景/应用退出场景/挂起重新运行场景/内存清理:应用终止场景等查看日志输出信息,以此加深对不同场景下各个生命周期状态跃迁过程的理解。此外,为了让大家更直观的了解各种状态与其相应的方法、通知间的关系。我对这些场景做了些摘要。

    以下内容摘自关东升的《iOS开发指南》

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

    场景描述:用户点击应用图标,可能是第一次启动,也可能是应用终止后重新启动。共经历两个阶段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通知。

    挂起重新运行场景的状态跃迁过程

    内存清除--应用终止场景

    场景描述:应用在后台处理完成时进入挂起状态(一种休眠状态)。如果这时发出低内存警告,为了满足其他应用对内存的需求,该应用就会被清除内存而终止运行。

    内存清除场景

    内存清除时应用终止运行。有两种情况:

    系统强制清除内存

    由使用者从任务栏中手动清除(即删除应用)

    内存清除后如果应用再次运行,上一次的运行状态不会被保存,相当于应用第一次运行。这种场景下,应用不会调用任何方法,也不会发出任何通知。

    相关文章

      网友评论

      • 小鬼别多嘴:微博,知乎程序被杀死狗他们是怎样回到上一个状态的?
        Z灬昊轩:@小鬼别多嘴 我测试了知乎,只有在首页点文章的时候才会回到之前的运行状态,如果我没猜错的话他是做了存储。如果让我做的话我会在他点击进入文章的时候加个标记并且存储数据,再次进入是判断存储中是否有这个标记,有就直接跳转到存储的页面(有H5写的痕迹,相当于直接跳转WKWebView,存储个网址就OK,加载广告业时候直接加载出页面),当然所有的浏览器都是一样的,都可以,这也是浏览器的特色,会在你点击的时候就帮你保存你打开的网址。
        小鬼别多嘴:抱歉,九宫格输入法的锅。他们的app被杀死后,再次打开还会回到之前运行的状态,微博刚试了好像不行,但是知乎可以,还有夸克浏览器也被杀死后可以回到之前的状态。他们用的什么手段实现?
        Z灬昊轩:你好,首先你的这个错别字真的吓了我一跳。然后程序杀死后就代表程序的的终止,也就是文章中的最后一个状态,再次打开是新的状态,不会保存之前的运行状态。最后希望你能清晰的表述你的问题,我会第一时间帮助你。

      本文标题:iOS(2018改)应用程序的生命周期

      本文链接:https://www.haomeiwen.com/subject/qubmxftx.html