盛年不重来,一日难再晨。及时宜自勉,岁月不待人。

  iOS系统资源是有限的,合理的去配置应用程序的运行状态以及了解app的生命周期对于大多数开发者来说是很重要的一件事情!在后台进行运行时app会受到系统的很多限制,但是也可以提高电池的使用和用户的体验。

1. 应用程序的运行状态

1.1)运行状态

  1. Not running 未运行状态,程序并没有进行启动时的状态;
  2. Inactive 未激活状态 ,程序在前台运行,但没有接收到任何事件。在程序没有事件需要处理时停留在这个状态,相当于程序休眠;
  3. Active 激活状态,程序在前台运行而且接受到事件,并对事件进行响应和处理。这也是前台的一个重要的状态;
  4. Background 后台状态,处于运行中的应用程序切换到后台时的状态,会在此状态保留一定时间,时间超过时就会进入应用程序的挂起状态,有的应用程序也可以根据需求使其长期进入后台状态;
  5. Suspended 挂起状态,此状态也是一种后台状态,于background的不同在于挂起状态的应用程序是不可以执行代码的,其特点是程序还是停留在内存中,当出现内存警告时iOS系统会首先把挂起的程序清除出内存并为处于前台运行状态的应用程序提供内存;

  下面是程序运行状态的变化图

1.2)运行状态的代理回调方法

//程序即将启动完成
//对应未启动状态,告诉代理程序已经进入启动状态但是还没有进入未激活状态
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
return YES;
} //程序启动完成
//对应已经启动状态,准备进入前台开始运行状态,当没有接收到事件时则表示的是未激活状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
} //应用程序进入激活状态,应用程序可以接受事件并对其进行处
-(void)applicationDidBecomeActive:(UIApplication *)application{ } //应用程序放弃了活动状态进入未激活状态,在此状态中应用程序无法接受事件进行处理
-(void)applicationWillResignActive:(UIApplication *)application{ } //应用程序进入后台,在后台继续执行的代码在此可以进行处理即可
- (void)applicationDidEnterBackground:(UIApplication *)application { } //应用程序将要进入前台,包含两个状态未激活和激活状态
-(void)applicationWillEnterForeground:(UIApplication *)application{ } //程序将要终止退出,用来保存一些数据和转状态,以及应用程序退出前的内存清理工作
-(void)applicationWillTerminate:(UIApplication *)application{ } // 应用程序完成载入
- (void)applicationDidFinishLaunching:(UIApplication*)application{ }

  有了这些回调,程序员就能很容易地捕捉应用程序当前的状态,从而做出处理。值得一提的是,在实际开发中,将所有的程序状态都放在AppDelegate中处理,并不是很方便。所以,也可以通过监听通知,获取到当前的程序状态。

UIKIT_EXTERN NSNotificationName const UIApplicationDidEnterBackgroundNotification       NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN NSNotificationName const UIApplicationWillEnterForegroundNotification NS_AVAILABLE_IOS(4_0);
UIKIT_EXTERN NSNotificationName const UIApplicationDidFinishLaunchingNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationDidBecomeActiveNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationWillResignActiveNotification;
UIKIT_EXTERN NSNotificationName const UIApplicationWillTerminateNotification;

2. 应用程序的生命周期

2.1)加载进入前台的生命周期

  应用程序进入前台的生命周期从图中可以看出包括启动时间,应用程序进入运行的时间,以及切换不同app时的时间。

  应用程序的启动时间:从图中可以看出,应用程序的启动时间从我们触发app开始,然后到main函数执行,到加载mainUI文件,到第一次加载完成以及加载其他UI完成的时间并进入未激活状态所用的时间就是启动app时的启动时间

  其代理方法的调用时间:

// 在第一次完成加载mainUI时进行加载
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions // 在完全加载成功UI时进入此方法通知app完成启动进入未激活状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions // 在应用程序处于运行状态时接受到事件时通知app进入激活状态
- (void)applicationDidBecomeActive:(UIApplication *)application

2.2)加载进入后台的生命周期

  从上图可以看出,当应用程序启动后,进入后台时会有一个判断是否可以在后台运行,允许后台运行时会一直处于后台运行状态并执行某些代码操作,当不允许运行时会进入到挂起状态不可执行任何代码操作。当我们在返回前台运行时会通过代理方法通知app程序的运行状态从后台变为前台的未激活状态和激活状态。

iOS程序生命周期流程的更多相关文章

  1. 图解ios程序生命周期

    图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate ...

  2. iOS程序生命周期 AppDelegate

    iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受 ...

  3. (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解         分类:  ...

  4. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...

  5. iOS Application Life Cycle 应用程序生命周期

    应用程序的状态 IOS的应用程序一共有5种状态. Not running(未运行):程序未启动 Inactive(未激活):其他两个状态切换时出现的短暂状态.唯一在此状态停留时间比较长的情况是:当用户 ...

  6. IOS应用程序生命周期&启动周期函数

    —程序的生命周期         a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程         b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...

  7. iOS学习笔记(四)——iOS应用程序生命周期

    开发应用程序都要了解其生命周期,开始接触android时也是从应用程序生命周期开始的,android的应用程序生命周期更多是其组件的生命周期,例如Activity.Service.今天我们接触一下iO ...

  8. 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系

    (1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...

  9. (转)深入浅出 iOS 之生命周期

    原文:http://www.cocoachina.com/applenews/devnews/2011/0817/3129.html 深入浅出 iOS 之生命周期 发布于:2011-08-17 10: ...

  10. 【转】深入浅出 iOS 之生命周期

    [iOS]深入浅出 iOS 之生命周期 深入浅出 iOS 之生命周期  http://blog.csdn.net/kesalin/article/details/6691766 罗朝辉(http:// ...

随机推荐

  1. VBA与VB的区别

    从语言结构上讲,VBA是VB的一个子集,它们的语法结构是一样的.两者的开发环境也几乎相同.但是,VB是独立的开发工具,它不需要依附于任何其他应用程序,它有自己完全独立的工作环境和编译.链接系统.VBA ...

  2. WPF自定义标题栏

    往往原有的标题栏无法满足需求,此时就需要进行自定义标题栏. 重新定义Window的Template 首先,需修改WindowChrome的几个属性 CaptionHeight属性值就是自定义标题栏的高 ...

  3. Linq开发技巧与业务逻辑校验

    Linq 是一种基于 .NET Framework 的编程语言,它的出现极大地提高了开发效率.Linq 提供了一种统一的查询语法,使得开发人员可以使用一种语言来查询不同类型的数据源,包括对象.集合.数 ...

  4. [kafka]部署安装单节点

    前言 kafka 3.0之前的版本需要依赖zookeeper,3.0版本之后可不依赖zookeeper. 基于zookeeper的安装步骤 节点IP:172.50.13.103 kafka版本:2.7 ...

  5. 基于python tornado实现的简易图床

    基于python tornado实现的简易图床 项目地址 因为买了阿里/腾讯的云服务器,但是使用云存储还需要收费,又加上家里正好有一台nas,又加上闲的没事,所以搞了一个小脚本 这个项目主要功能是为t ...

  6. jmeter:内存溢出解决办法

    使用jmeter执行性能测试,报错:java.lang.OutOfMemoryError: Java heap space 需要对jmeter的jvm进行调优.记录如下: 1. 问题记录及分析: 使用 ...

  7. win10安装mysql5.7.35教程

    前提条件:我下载的是压缩包版本5.7.35,下载地址是 https://downloads.mysql.com/archives/community/ 下载完后解压,并在如下图目录里加入data文件夹 ...

  8. Luckysheet:一个纯前端的excel在线表格

    最近因为项目要求,需要在页面上添加一个在线编辑excel的功能,因此只能在网上找有没有直接用的插件,最后很幸运的是幸好找到了一个 ----luckysheet. 这个是从luckysheet官网上找的 ...

  9. Vue【原创】基于【日历组件Calendar】的【节假日管理】功能整合

    基于日历组件(lilo-calendar)的节假日管理功能整合. 效果图: 完整代码: 1 <template> 2 <div class="root-calendar&q ...

  10. 深入探究API接口

    作为程序员,我们经常会遇到需要获取外部数据或调用外部服务的情况.而API(Application Programming Interface,应用程序编程接口)接口就是这样的一种机制,它允许我们的应用 ...