文章目录

  • 主函数main
  • 应用程序的状态
  • 应用程序的启动过程
  • 应用程序从前台切换到后台
  • 应用程序从后台切换到前台
  • 响应中断
  • 锁屏/解锁
  • app的生命周期和viewcontroller的生命周期

App从启动到退出的过程中,iOS应用程序不断从系统接收各种事件,如:用户点击了屏幕、用户点击了Home键,并对这些事件进行响应。接收事件是UIApplication对象的工作,但是,响应事件需要由程序员编写的代码来处理。为了理解事件响应需要在哪里处理,就必须对iOS应用程序的整个生命周期和事件周期有所了解

主函数main

main()函数是每个iOS应用程序的入口,但在实际开发中,基本不需要在main()中进行额外的处理。在main中,最核心的功能就是把应用程序的控制权移交给UIKit框架,其中UIApplicationMain函数主要完成如下3个工作:

  • 创建应用程序所需的核心对象;
  • 读取storyboard文件,来加载用户界面;
  • 调用自定义的代码,用来定制应用程序的启动过程。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {@autoreleasepool {return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}

应用程序的状态


Not Running(未运行):应用程序未启动或者被终止;
Inactive(待激活):应用程序在前台运行,但是不能接收事件(UIEvent)。应用程序在不同状态之间切换时,经常会存在该状态。例如:在App显示启动页时,是从Not Running到Active的过程,中间会存在Inactive状态;
Active(激活,前台运行):应用程序在前台运行,可以接收事件(UIEvent);
Background(后台运行):应用程序处于后台并且正在执行代码。绝大多数应用程序在进入挂起状态时,会短暂经历这个状态。
Suspended(挂起):应用程序处于后台,并且不能执行代码。此时,当内存不足时,操作系统有可能会自动把挂起状态的应用程序移除,以便给处于Active状态的应用程序提供更多的内存空间。

应用程序的启动过程


当用户点击icon的时候,应用程序会经历:NotRunning->Inactive->Active的过程。在这个过程中,APPDelegete对象的如下方法会被调用。

-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
}

在实际开发过程中,假如不需要通过Storyboard加载界面,那么就需要在didFinishLaunchingWithOptions:方法中,设置window的根控制器。

应用程序从前台切换到后台

当用户点击Home键的时候,应用程序会经历从Active -> Background -> Suspended过程,在这个过程中,会调用AppDelegate对象中的applicationWillResignActive: 以及applicationDidEnterBackground:方法 。在实际的开发过程中,当用户点击Home键使应用程序切换到后台时,需要在这些方法中对数据或者状态进行保存。

在默认情况下,applicationDidEnterBackground:方法有大概5秒钟的时间来完成一些任务。假如说5秒钟的时间不够,则需要调用beginBackgroundTaskWithExpirationHandler:方法来申请更多的后台运行时间,后台运行的时间由backgroundTimeRemaining属性来确定。

- (void)applicationDidEnterBackground:(UIApplication *)application {NSLog(@"%s",__func__);__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{// Clean up any unfinished task business by marking where you// stopped or ending the task outright.[application endBackgroundTask:bgTask];bgTask = UIBackgroundTaskInvalid;}];// 立即开始执行的任务dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{       NSLog(@"________");[application endBackgroundTask:bgTask];bgTask = UIBackgroundTaskInvalid;});
}

应用程序从后台切换到前台

当应用程序从后台切换到前台时,会调用applicationWillEnterForeground:以及applicationDidBecomeActive:方法。

响应中断

当来电或者闹钟触发的时候,应用程序会触发中断,这时AppDelegate对象会首先调用applicationWillResignActive:方法,当用户接听电话时,会直接跳转到电话程序;假如用户选择不接听电话,这时会返回应用程序,并调用applicationDidBecomeActive:方法。

锁屏/解锁

当用户锁屏的时候,应用程序会调用AppDelegate对象的applicationWillResignActive:方法以及applicationDidEnterBackground:方法。当用户解锁后,应用程序会调用applicationWillEnterForeground:方法以及applicationDidBecomeActive:方法。

app的生命周期和viewcontroller的生命周期

APP的生命周期就是UIApplicationDelegate中的回调方法,这些方法是根据状态变化进行响应的地方,其中最常用的就是以下7个方法:

application:willFinishLaunchingWithOptions:
在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

application:didFinishLaunchingWithOptions:
表示App将从未运行状态进入运行状态,用于对App的初始化操作

applicationDidBecomeActive:
当应用即将进入前台运行时调用

applicationWillResignActive:
当应用即将进从前台退出时调用

applicationDidEnterBackground:
当应用开始在后台运行的时候调用

applicationWillEnterForeground:
当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用

applicationWillTerminate:
当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。

下面让我们来做一些操作看一下生命周期调用的顺序

1、程序启动:状态由Not running -> Inactive -> Active
willFinishLaunchingWithOptions
didFinishLaunchingWithOptions
applicationDidBecomeActive
2、点击home键|锁屏:由Active -> Inactive -> Backgroud
applicationWillResignActive
applicationDidEnterBackground
3、重新进入前台:Backgroud -> Inactive -> Active applicationWillEnterForeground
applicationDidBecomeActive
4、在前台,双击home键,手动杀掉APP:Active -> Inactive -> Backgroud -> end
applicationWillResignActive
applicationDidEnterBackground
applicationWillTerminate
当URL到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL
application:didFinishLaunchingWithOptions:
application:openURL:sourceApplication:
applicationDidBecomeActive
当URL到达时,如果你的应用正在background运行或被suspended,它将会被移到前台以打开URL
applicationWillEnterForeground
application:openURL:sourceApplication:
applicationDidBecomeActive

UIViewController的生命周期
当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc
创建对象,分配空间
2、init (initWithNibName|initWithCoder)
初始化对象,初始化数据
3、awakeFromNib
所有视图的outlet和action已经连接,但还没有被确定。
4、loadView
完成一些关键view的初始化工作,加载view。
5、viewDidLoad
载入完成,可以进行自定义数据以及动态创建其他控件
6、viewWillAppear
视图将出现在屏幕之前
7、viewWillLayoutSubviews
将要对子视图进行调整
8、viewDidLayoutSubviews
对子视图进行调整完毕
9、viewDidAppear
视图已在屏幕上渲染完成
10、viewWillDisappear
视图将被从屏幕上移除
11、viewDidDisappear
视图已经被从屏幕上移除
12、dealloc
视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
13、didReceiveMemoryWarning

IOS App的生命周期相关推荐

  1. 《移动App测试的22条军规》—第1章1.2节移动App的生命周期

    本节书摘来自异步社区<移动App测试的22条军规>一书中的第1章,第1.2节移动App的生命周期,作者黄勇,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.2 ...

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

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

  3. iOS对UIViewController生命周期和属性方法的解析

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

  4. APP用户生命周期价值分析与测量

    用户在任何公司的整个生命周期中都会获得或者失去,但真正伟大的产品或服务可以让用户关系更为稳固,不断增加用户生命周期价值. 许多公司忽略了用户生命周期价值这一指标,而是采取短视的方法,在短期内优化单一用 ...

  5. 《iOS移动开发从入门到精通》图书连载4:iOS应用的生命周期

    iOS应用的生命周期 iOS应用的生命周期是指从应用程序的启动,到应用程序结束整个阶段的全过程. 整个iOS应用的生命周期包含了各种状态,有时系统会从应用的一种状态切换至另一种状态来响应系统发生的事件 ...

  6. 监控android App Activity生命周期

    说下场景: 1,监控当前应用生命周期 2,调试应用,接手一个庞大的应用,快速知道当前是那个activity ,或者 fragment(会在另一篇中讲) 3,如果你正常开发SDK ,当时你又想获取当前的 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统 ...

  8. 深度解析~iOS应用程序~生命周期

    摘要:iOS应用程序一般都是由自己编写的代码和系统框架组成,系统框架提供一些基本infrastructure给App来运行,而开发者则自己编写代码定制App的外观和行为,了解iOS Infrastru ...

  9. 【七千字心得】APP全生命周期管理

    今年众多互联网APP遇到了通报批评.整改.甚至下架的处理场景.APP仿佛成为了一个"烫手山芋",但他更是一个自己公司的"掌上明珠". 从移动互联网时代以来,AP ...

最新文章

  1. jetty服务器上运行html页面,web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)...
  2. 无监督学习 k-means_无监督学习-第4部分
  3. ollydbg,ring3级别的调试软件
  4. 两篇 Spring 总结(一)
  5. anti-wrinkle_anti-wrinkle cream是什么意思
  6. python写crm_Python CRM项目八
  7. python字符串去掉标点_在Python去掉标点符号字符串的最佳方式_string_酷徒编程知识库...
  8. JFinal 表自动绑定插件实现,实现零配置,支持多数据源
  9. linux防火墙的策略规则
  10. cmd 、java获取硬盘的序列号(serialnumber)物理地址 和磁盘ID逻辑地址
  11. 红包大战复盘:谁赢得了这场春节游戏?
  12. IGS发布RINEX 4.00
  13. win7m与linux双系统都进不去,win10下安装黑苹果双系统
  14. 广州java程序员平均工资_9月程序员工资统计已公布,你拖后腿了吗?
  15. 使用uigi将英雄小头像显示在详细资料中(图片切换)
  16. Tox:你想知道的内容
  17. 战神引擎mud2没有mysql文件_战神引擎架设不要(MongoDB)芒果数据库配置教程
  18. 怀揣梦想,我依靠自己,往后余生越来越精彩
  19. 《计算机视觉之目标检测》IOU详解及代码
  20. Win10的截图功能

热门文章

  1. django之 报错(1146, “Table ‘demo2.web‘ doesn‘t exist“)
  2. 10 系统建模语言SysML——参数图
  3. 文件管理之文件的逻辑结构
  4. Silverlight 结构
  5. gRPC大数据量消息传递方法
  6. SpringCloud熔断机制大概什么意思
  7. python画气泡图_画气泡图的十二个图表库
  8. 裸金属服务器启动之PXE与IPXE实践
  9. 商城APP软件开发要素有哪些
  10. python 等腰三角形的性质_Blender 脚本之 Operator 初探