iOS应用程序运行原理及各步骤解析

本文详细解析了iOS应用的运行状态,包括Not running、Inactive、Active、Background和Suspended,以及状态之间的转换。介绍了应用启动过程、后台运行、响应中断、切向后台的处理方法,特别是对内存管理和事件处理的注意事项。还涵盖了主运行循环如何处理用户事件,以及应用在不同状态下的行为。
摘要由CSDN通过智能技术生成

1. Not running:应用还没有启动,或者应用正在运行但是途中被系统停止。 [码农也需要休息吧,不能每天无休止的干下去,万一哪天来个猝死,老婆孩子怎么办,父母怎么办?中国有哪个公司一样,能像Google一样替你料理后事吗?]

2. Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。[这个过程类似跟项目经理确定需求阶段,要我们做事总要知道做什么]

3. Active:当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。[这个过程就是我们苦逼的开发阶段了,加班加点编码,给点加班费吧,车坏了也要修啊]

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

5. Suspended:应用处在后台,并且已停止执行代码。系统自动的将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处于Suspended状态的应用清除出内存以为正在前台运行的应用提供足够的内存。[就像总会碰到不知道的技术的时候,这过过程就类似我们的学习阶段,大部分开发还是挺乐意学习的]

0_13248255215kx7.gif.png

当应用启动时,将从Not running状态进入foreground或者直接进入background运行。进入前台时,其实最终是要进到Active状态,中途会先短暂进入到Inactive状态。在应用启动时,系统会创建一个process和一个主thread,并且在主thread中调用main函数,即上面二提到的。 main函数在创建工程时由Xcode自动生成。main函数负责UIApplication对象初始化,及设置UIApplication代理类等等。在应用初始化并准备进到前台运行之前的大部分工作都在main函数中完成。

    应用被启动直到前台运行的过程如下图,右侧部分为调用的UIApplication代理类的方法。

     如果你的应用要求启动后直接进入到Backgroundu状态,则对应的启动过程和上稍有区别,主要不同是,上面的应用是进入到active,而你的应用要进入到background,并且处理事件,当没有事件处理时,会被挂起进入到Suspended状态。如下图所示。

 

     需要注意的一点是:对于从Not running状态直接进入到background状态的应用,在启动进入到background状态时,如果应用有界面,系统仍然会加载用户界面文件,只是不会显示在应用的window上面。
    为了在程序中确定你的程序是进入到了foreground还是background,你可以在application:didFinishLaunchingWithOptions:   方法中检测UIApplication类对象的applicationState属性,如果应用进入到了foreground,则属性值为UIApplicationStateInactive,如果进入到了background,则为UIApplicationStateBackground。

检测示例代码:

UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return (state==UIApplicationStateActive || state==UIApplicationStateInactive );

    注:当应用启动时要求打开一个URL,则此类应用的启动过程和三中的两个图又有稍微区别, 具体如下:

具有自定义URL模式的应用必须能够处理所有传递给它的URLs。所有的URL都是传递给应用的代理来处理,无论当前应用是处在启动阶段或是正在运行running或是在后台background。为了能够处理URL请求,你的应用代理必须实现下面的接口方法:

(1)使用application:didFinishingLaunchingWithOptions:方法检索URL信息,并且决定是否想要打开这个URL,这个方法只有在应用被启动的时候调用。

(2)iOS4.2或更新的版本,使用方法application:openURL:sourceApplication:annotation:方法去打开文件。

(3)iOS4.1或更老的版本,使用方法application:handleOpenURL:方法去打开文件。

     b.修改老项目
     
当URL请求到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL。你的application:didFinishingLaunchingWithOptions:方法实现中应该包含从选项字典options dictionary中检索URL并且判断该应用能否打开它的部分。如果能够打开,则返回YES,让方法applic

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值