我们平常使用APP时,一般人都会知道有:简单的正在使用状态;通过home键等方式离开应用,但是不关闭应用,即后台状态;以及调出后台程序管理后向上滑动将应用“杀死”,三种状态。而我们开发者则会了解得更深便于进行开发工作。还有更多更深的知识还需要在未来进行探索后总结。而接下来将对当前初级阶段对APP的生命周期所学知识进行总结。

应用程序的五种状态

1. Not running:

应用还没有启动,或者应用正在运行但是途中被系统停止。

2. Inactive:

当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。例如用户锁屏或者接到通知去响应别的事件的时候。

3. Active:

当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。

4. Background:

应用处在后台,并且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。除了一些经过特殊的请求后可以长期处于此状态的应用。存在一些启动后会直接进入background状态的应用。

5. Suspended:

应用处在后台,并且已停止执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

iOS程序执行过程

可由下图做一个总览:

其中,监听系统事件的方法在AppDelegate.m文件中,里面的几个方法代理的回调分别解释为:

// 告诉代理启动基本完成程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
复制代码
// 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如打来电话
- (void)applicationWillResignActive:(UIApplication *)application
复制代码
// 当应用程序入活动状态执行,此方法跟上面那个方法相反
- (void)applicationDidBecomeActive:(UIApplication *)application
复制代码
// 当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationDidEnterBackground:(UIApplication *)application
复制代码
// 当程序从后台将要重新回到前台时候调用,此方法跟上面的那个方法相反
- (void)applicationWillEnterForeground:(UIApplication *)application
复制代码
// 当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作
- (void)applicationWillTerminate:(UIApplication *)application
复制代码

在此添加NSLog打印进行相关操作时执行的方法

各个操作时方法执行顺序均为从上到下。

分为启动程序时:

function:-[AppDelegate application:didFinishLaunchingWithOptions:] line:25 content:-[AppDelegate application:didFinishLaunchingWithOptions:]
复制代码
function:-[AppDelegate applicationDidBecomeActive:] line:52 content:-[AppDelegate applicationDidBecomeActive:]
复制代码

点击home键时:

function:-[AppDelegate applicationWillResignActive:] line:33 content:-[AppDelegate applicationWillResignActive:]
复制代码
function:-[AppDelegate applicationDidEnterBackground:] line:40 content:-[AppDelegate applicationDidEnterBackground:]
复制代码

双击home键或点击图标再次打开程序时:

function:-[AppDelegate applicationWillEnterForeground:] line:46 content:-[AppDelegate applicationWillEnterForeground:]
复制代码
function:-[AppDelegate applicationDidBecomeActive:] line:52 content:-[AppDelegate applicationDidBecomeActive:]
复制代码

了解了APP运行中的几种状态和周期,我们可以对一些状况进行响应的优化和处理。

例如当出现突然来电话了等导致程序临时进入Inactive状态时,我们可以在applicationWillResignActive:方法中:

  • 停止timer 和其他周期性的任务
  • 停止任何正在运行的请求
  • 暂停视频的播放
  • 如果是游戏那就暂停它
  • 减少OpenGL ES的帧率
  • 挂起任何分发的队列和不重要的操作队列(你可以继续处理网络请求或其他时间敏感的后台任务)。

当程序进入后台时:

应该实现:

  • 保存用户数据或状态信息,所有没写到磁盘的文件或信息,在进入后台时,最后都写到磁盘去,因为程序可能在后台被杀死
  • 释放尽可能释放的内存

在后台时,每个应用程序都应该释放最大的内存。系统会尽可能保证多的应用程序在后台运行。所以后台会为了减少程序占用的内存自动回收一些系统帮助你开辟的内存,如:

  • 系统回收Core Animation的后备存储
  • 去掉任何系统引用的缓存图片
  • 去掉系统管理数据缓存强引用

我们也可以做一些努力:

把一些对象的强引用去掉,这样编译器就可以回收这些内存:

  • 图片对象
  • 你可以重新加载的 大的视频或数据文件
  • 任何没用而且可以轻易创建的对象

程序终止时:

APP终止时,系统会调用applicationWillTerminate:方法,我们可以在其中进行一些保存数据或状态或一些清理的工作。方法中的这些工作会有最多5秒的时间限制,如果超过时间还有未完成的任务,你的程序就会被终止而且从内存中清除。

而像进入后台和程序终止状态,如果还需要长时间的运行任务,可以调用 beginBackgroundTaskWithExpirationHandler方法去请求后台运行时间和启动线程来运行长时间运行的任务。

iOS初级开发学习笔记:APP生命周期的学习总结相关推荐

  1. day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法

    系列文章目录 day1学习vue2笔记 vue指令 day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios day3 vue2 学习笔记 vue组件 day4 vue 学习笔记 组件 生命 ...

  2. IOS学习笔记——ViewController生命周期详解

    在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...

  3. react学习笔记(8)生命周期回顾与再认识

    生命周期 生命周期是一个组件从创建到销毁的过程. 当组建实例被创建并且插入到DOM中,需要调用的函数,就是生命周期函数. 也就是说,组件加载完成前后.组件更新数据.组件销毁,所触发的一系列的方法. 1 ...

  4. android学习笔记---36_Activity生命周期

    36_Activity生命周期 ----------------------------- 1.Activity生命周期,用于activity在运行时候受到一些突然事件的影响   ,例如:正在使用一个 ...

  5. Gavin小黑屋——Vue 学习笔记 :生命周期特点(先渲染HTML标签再渲染数据)

    Vue基础   生命周期特点(先渲染HTML标签再渲染数据) 目录 Vue基础   生命周期特点(先渲染HTML标签再渲染数据) 一.Vue生命周期 Vue 的生命周期总共分为8个阶段:创建前/后,载 ...

  6. iOS 实战开发课程笔记

    iOS 实战开发课程笔记 本贴旨在作为对极客班 <iOS 开发实战>第五期期课程视频重新学习的笔记. 目标是建立一个比较完整的 iOS 开发知识点框架以及快速手册. 对各个内容的详细研究会 ...

  7. IOS 初级开发入门教程(四)基础控件使用小练习

    前言 看完前面3章的内容,基本对IOS开发有一些认识了,这章我们开始动手去实践做点小练习,学习如何创建并设置标签和按钮(Label & Button)的相关属性,以及通过一个交互式的案例演示动 ...

  8. 微信小程序----App生命周期

    WXRUI体验二维码 如果文章对你有帮助的话,请打开微信扫一下二维码,点击一下广告,支持一下作者!谢谢! App生命周期 onLaunch----当小程序初始化完成时,会触发 onLaunch(全局只 ...

  9. flutter中state生命周期与app生命周期与路由监听

    State生命周期 1.第一次展示到屏幕上时会依次调用当前element的构造函数,initState,didChangeDependencies,build 2.如果只是自己发生了更新,则只会回调b ...

最新文章

  1. MindArmour差分隐私
  2. 「预训练-调优」范式的未来
  3. 在Java中使用Spliterator
  4. 数据录入工作,使用VBA
  5. MySQL-通过MaxScale实现读写分离初探
  6. 多核处理器_英特尔十代酷睿i5-10400大战R5 3600,到底谁是千元处理器一霸?
  7. (pytorch-深度学习)SE-ResNet的pytorch实现
  8. datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理
  9. centos 卸载软件_一篇看懂!详解-Linux系统中安装软件的三种方法
  10. java输出当前文件所在路径
  11. centos7.3二进制安装mariadb10.2.8
  12. win访问linux NFS磁盘映射共享驱动器卡顿
  13. .config文件相关说明
  14. Keil5(C51,MDK)注册详细教程(2032年版本)
  15. 路由器带硬盘+文件服务器,带硬盘路由器推荐,几款硬盘路由器产品PK
  16. c# gerber文件读取_PCB加工中Gerber文件的解析及其图形绘制和分割的研究
  17. Flash加速功能实现
  18. Unity中使用摇杆控制
  19. 练习linux命令的软件,找到一个linux下的中文打字练习软件
  20. 一款自制的视频录制软件

热门文章

  1. 仿ios桌面vivo_vivo全新OriginOS细节曝光:系统UI大变样
  2. 树莓派编译mysql卡死_关于树莓派编译工作空间卡死情况的解决办法
  3. linux gdb 脚本,如何写gdb命令脚本
  4. php switch case default,switch语句中必须有default选项吗?
  5. 二维列表的len_基于Voronoi二维多晶体的衍生脚本操作
  6. DevExpress v18.2版本亮点——Office File API 篇
  7. wxpython 文本框TextCtrl
  8. kafka调试工具kafkacat的使用
  9. STA 137 Topics covered this week
  10. genymotion常见问题及解决方案