iOS应用生命周期相关内容

      了解应用程序生命周期,在iOS开发中相当重要,在实际当中,许多人对生命周期一知半懂,这样在今后的开发中会遇到很多障碍,这样在面对应用不同状态时,就不知道如何进行相关处理,这等于给自己挖了不小的坑。因此对于iOS生命周期需要引起注意。

一、程序的入口Main 函数


基于C语言开发的应用的入口时main函数,iOS 同样也是以main函数为入口. 对于iOS应用我们不需要手动去写main函数,在新建一个应用时系统已经自动为我们创建好了main函数,如下所示:我们不需要修改系统为我们生存的main函数,apple也不建议我们进行修改。

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

    @autoreleasepool {

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

    }

}


这里main函数仅仅就是把控制交给UIKit框架,这个过程由UIApplicationMain 函数通过创建应用的核心对象来处理, 从可能的故事板中载入用户界面,调用我们自己写的代码以便于我们能做一些初始的设置。同时把应用放到运行循环中。你仅仅只要提供故事板文件和一些自定义的初始化代码。


二、一个应用程序的构成

每一个应用的核心是UIApplication对象,他的工作是便于系统和应用的其它对象交互,图中所示了大多数应用中的对象,也对各类对象的角色进行了说明,首先我们要注意的是iOS应用使用MVC架构,这个模式很好的把应用的数据、业务逻辑从数据的视觉呈现中分离出来。这个架构对创建运行在不同设备不同屏幕尺寸的应用是非常重要的。 


一个应用与另外一个应用不同在于数据的管理(响应业务逻辑)、怎么展示给用户数据,大多数uikit的交互并不定义你的应用而是用来帮助完善、精炼应用的行为。例如app delegate 的方法,让你知道应用状态何时发生改变以便你能自定义代码去合理的响应。

三、主运行循环

一个应用的Main Run Loop负责处理用户相关的事件。UIApplication对象在程序启动时设置main run Loop,用来处理事件和更新视图的界面。它是运行在程序的主线程上的。这样保证了接收到用户相关操作的事件是按顺序处理的。主运行循环中的事件处理:

 


     图中展示了主运行循环的架构以及应用中用户事件是怎么产生的。用户与设备互互,由系统产生与这些交互有关的事件,通过uikit指定端口进行传递。事件在应用内部排成队列,并一个接一个分发到main run loop中进行处理。UIApplication是第一个接收到事件的对象,它决定需要做些什么。一个触摸事件通常被分发到主窗口对象(main window object),窗口在分发到对应触摸事件的View.其它事件可以通过不同的路劲松到各种应用对象中。 


      一些事件,类似于触摸事件,远程操控事件都是由app的 responder objects 对象处理的。Responder objects 在你的app里到处都是,如:UIApplication 对象。你的view对象、view controller 对象,都是resopnder objects。大部分事件的目标都指定了resopnder object,如果需要,事件也可以传递给其他响应对象(通过响应链)。如,一个view对象不处理事件,可以传给它的父类view或者view controller。


     触摸事件发生在controls(例如button)中的处理与发什么在其它views中的事件是不同的。control仅仅只有一些有限的交互,这些交互事件被重新打包成动作信息传递给合适的目标对象。因此target-action设计模式使得controls在应用中触发事件执行自定义代码变得容易。


四、应用的执行状态


        1.Not running(未运行):应用还没有启动,或者应用正在运行但是途中被系统停止。

        2.Inactive(非活动):当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

        3.Active(活动):当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。

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

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


程序状态变化图:




      -(void)applicationWillResignActive:(UIApplication *)application

        说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

        -(void)applicationDidBecomeActive:(UIApplication *)application

        说明:当应用程序进入活动状态执行,

        -(void)applicationDidEnterBackground:(UIApplication *)application

        说明:当程序被推送到后台的时候调用。你的应用此时在后台运行很可能随时都会挂起,所以要设置后台继续运行,则在这个函数里面设置即可,

        -(void)applicationWillEnterForeground:(UIApplication *)application

        说明:当程序从后台将要重新回到前台时候调用,此时应用还是非活动的。

        -(void)applicationWillTerminate:(UIApplication *)application

        说明:当程序将要退出时被调用,当应用处于挂起状态时,并不会调用该方法。

        -(void)applicationDidFinishLaunching:(UIApplication*)application

        说明:当程序载入后执行。


五、详细生命周期

1、启动生命周期

a、启动应用到前台:启动一个应用程序到前台的执行步骤,包含调用的app delegate方法。


b、启动应用进入后台:



2、响应暂时中断



3、从后台到前台



4、从前台到后台 




当用户按下home按钮,或者系统启动另一个应用。前台应用则转到非活动状态,然后转到后台状态。这些状态转化奖调用应用的委托方法:applicationWillResignActive:和applicationDidEnterBackground:,applicationDidEnterBackground:委托方法调用返回后不久,大多数应用转到挂起状态。应用请求指定后台任务(如:播放阴雨)活着那些请求需要额外的执行时间的应用,会在此状态保持更长一段时间。

参考:

https://developer.apple.com/library/prerelease/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html#//apple_ref/doc/uid/TP40007072-CH8-SW2


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值