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

  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. Redis从入门到放弃(8):哨兵模式

    在前面的文章中介绍了Redis的主从复制,但主从复制存在一定的缺陷.如果Master节点宕机,因为不具备自动恢复功能,需要人工干预,那么在这个干预过程中Redis将不可用. 为了解决这一问题,Redi ...

  2. MIT6.s081/6.828 lectrue4:page tables 以及 Lab3 心得

    不管是计算机组成还是操作系统,虚拟内存都是其中的重要内容,所以这一节我会结合 CSAPP 第九章:虚拟内存 来一起复习(顺便一说,CSAPP 这一节的 lab 是要求设计一个内存分配器,也是很有意思的 ...

  3. python独立脚本应用Django项目的环境

    一.需求说明 一直用 Django 在开发一个网站项目,其中的注册用户和登录,都是使用Django自带的认证系统.主要是对密码的加密,在注册或者登录的时候,前端传递多来的密码,我会使用Django的s ...

  4. 在.NET Framework中使用RocketMQ(阿里云版)实战【第二章】

    章节 第一章:https://www.cnblogs.com/kimiliucn/p/17662052.html 第二章:https://www.cnblogs.com/kimiliucn/p/176 ...

  5. HDLbits_Conwaylife

    题目介绍 题目链接 Conwaylife 简介 题目要求我们实现一个康威生命游戏的电路. 该游戏在一个二维网格空间中进行,在该题目中是 16 * 16 的大小,每一个格子都有两种状态(0 或 1),代 ...

  6. 2015-CS

    2015-CS 数据库部分 create table [EMPLOYEE]( [EmpNo] varchar(10) not null primary key, [EmpName] varchar(1 ...

  7. Llama2-Chinese项目:2.1-Atom-7B预训练

      虽然Llama2的预训练数据相对于第一代LLaMA扩大了一倍,但是中文预训练数据的比例依然非常少,仅占0.13%,这也导致了原始Llama2的中文能力较弱.为了能够提升模型的中文能力,可以采用微调 ...

  8. 前端设计模式:单例模式(Singleton)

    00.基本概念 单例模式(Singleton Pattern),也称单体模式,就是全局(或某一作用域范围)唯一实例,大家共享.复用一个实例对象,也可减少内存开销.单例模式应该是最基础.也最常见的设计模 ...

  9. 一款广受社区好评的 WAF

    大家好,我是 Java陈序员,我们有时会搭建一个属于自己的网站,但是自建网站很容易被收到攻击,今天给大家介绍一款简单免费好用的 WAF 网站防护工具. WAF 是 Web Application Fi ...

  10. Vue 中的 Ajax

    1.1 使用代理服务器 1.1.1 方式一 在 vue.config.js 中添加如下配置: devServer:{ proxy:"http://localhost:5000" } ...