1. 应用程序的生命周期

1.1 应用程序的状态

应用程序在整个生命周期中会在五种状态之间不断转换。

  • Not running未运行,程序没有启动。
  • Inactive未激活,程序在前台运行,但没有接收到任何事件,或被其他任务强制占用了,例如突然来了电话、程序在前台时手机自动锁屏等。在没有事件处理情况下程序通常停留在这个状态。
  • Active激活,程序在前台运行而且接收到事件。这也是前台的一个正常的模式。
  • Backgroud后台,程序在后台但能执行代码,大多数程序进入后台状态后,只会在后台状态上停留一段时间,当时间到了之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态而不进入挂起状态(Suspended)。
  • Suspended挂起,程序在后台不能执行代码。系统会自动把后台程序变成这个状态而且不会发出通知。当挂起时,程序仍驻留在内存中。当系统内存不足时,系统就会把挂起的程序清除掉,为前台的程序提供更多的内存。

2. AppDelegate

APP启动时基本上每一次的状态改变都会调用一些delegate中的方法来响应当前的状态,让我们可以对程序进行特定操作。

2.1 willFinishLaunching

willFinishLaunching:程序将要完成启动。只在程序启动时执行一次。launchOptions:存存储程序启动的原因。

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

2.2 didFinishLaunching

didFinishLaunching:程序已经完成启动,将要显示界面了。只在程序启动时执行一次。launchOptions:存存储程序启动的原因。

didFinishLaunching是在app显示界面给用户之前最后执行的状态,理所当然我们可以在这个方法内完成一些基本的初始化,但是应该是轻量级的初始化操作,不然会导致程序启动时间长,影响用户体验。

举一些栗子:

  • 不使用StoryBoard,需要配置window
  • 第三方登录sdk注册,以及很多第三方sdk的初始化配置
  • 判断程序接下来的业务逻辑,播不播放引导图片?播不播放开屏广告?有没有登录?

但项目复杂了之后,需要配置的东西越来越多,所以didFinishLaunching非常容易耦合,这是我们应该要注意的。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//若用户直接启动,launchOptions内无数据。//若由其他程序通过openURL:启动。//launchOptions中UIApplicationLaunchOptionsURLKey的数据为openURL:的参数url。//launchOptions中UIApplicationLaunchOptionsSourceApplicationKey的数据为启动本程序的源程序的bundle ID(NSString)。NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];if (url) {[self launchOptionsWithURL:url];}NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey];if (bundleId) {[self launchOptionsWithBundleId:bundleId];}//若由远程通知启动。//launchOptions中UIApplicationLaunchOptionsRemoteNotificationKey对应数据为启动本程序的远程通知信息useinfo(NSDictionary)。NSDictionary *useinfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];if (useinfo) {[self launchOptionsWithUseinfo:useinfo];}return YES;
}

2.3 DidBecomeActive

DidBecomeActive:程序已激活。程序在处于前台时调用:程序第一次启动时、从后台返回前台时。

若程序之前在后台,可以在这方法内重新拉取数据,刷新用户界面。

- (void)applicationDidBecomeActive:(UIApplication *)application;

2.4 WillResignActive

WillResignActive:程序将要进入未激活。程序在处于前台时调用:有电话打进来、手机锁屏等。程序被其他任务强制占用了,就会调用这个方法,所以这个方法也称为程序中断调用方法。

实际运用场景为:

  • 对音频、视频、游戏的暂停操作
  • 暂停定时器
  • 减少OpenGL ES帧率
  • 暂停正在执行的任务,若有下载任务可以取消或暂停。
- (void)applicationWillResignActive:(UIApplication *)application {}

2.5 DidEnterBackground

DidEnterBackground:程序已经进入后台。程序从前台进入后台时调用。

作用是:

  • 释放共享资源
  • 保存用户数据(写到硬盘)
  • 作废计时器
  • 保存足够的程序状态以便下次恢复
- (void)applicationDidEnterBackground:(UIApplication *)application {}

2.6 WillEnterForeground

WillEnterForeground:程序将要进入前台。程序从后台进入前台时调用。

WillEnterForeground主要用于撤销WillResignActive中做的操作。

- (void)applicationWillEnterForeground:(UIApplication *)application {}

2.7 WillTerminate​​​​​​​

WillTerminate:程序将要终止。程序终止之前调用。

目的就是为了保留一些重要的数据,方便下次启动后的恢复,达到一种让用户感觉该程序永远运行在后台从来没被终止过的感觉。

- (void)applicationWillTerminate:(UIApplication *)application {[self saveContext];
}

下面给出这些方法的交互先后顺序:

1、启动程序:

--willFinishLaunchingWithOptions

--didFinishLaunchingWithOptions

--DidBecomeActive

2、按下Home键:

--WillResignActive

--DidEnterBackground

3、重新点击程序:

--WillEnterForeground

--DidBecomeActive

iOS开发-AppDelegate相关推荐

  1. IOS开发—— 获取AppDelegate的属性或字段

    IOS开发-- 获取AppDelegate的属性或字段 其它控制器中: AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplicat ...

  2. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

  3. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  4. (0097)iOS开发之应用间的分享系列(2)

    (0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(3) Share Extension将应用添加到系统分享列表 怎么把自己的应用添加到系统分享面板的列表中,并打 ...

  5. (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新

    iOS开发技术分享群 147787076 [友盟+]友盟统计分析SDK已全面支持HTTPS,请IOS开发者及时升级文档(http://dev.umeng.com/analytics/ios-doc/i ...

  6. iOS开发之使用XMPPFramework实现即时通信(二)

    上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...

  7. IOS开发系列--IOS程序开发概览

    IOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 9983 阅读, 51 评论, 收藏, 编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我 ...

  8. [iOS]关于零基础学习iOS开发的学习方法总结

    关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...

  9. iOS开发系列--网络开发(转)

    iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 66365 阅读, 56 评论, 收藏, 编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微 ...

最新文章

  1. WSDM 2022 | 中科院、腾讯、北航提出:跨领域推荐中的个性化迁移用户兴趣偏好...
  2. 初中数学老师计算机培训反思,初中数学教师培训心得体会
  3. USACO_1_4_Mother's Milk
  4. oracle增量合并存储过程,怎么将视图与存储过程里的逻辑合并
  5. 10大申请攻略+套磁技巧助你完胜美研申请
  6. gRPC学习记录(二)--Hello World
  7. css规则中区块block,CSS的命名方式:BEM(区块、元素、修饰符)
  8. ​赠书 | 云游戏搭上 5G 快车,华为、腾讯争相布局
  9. 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
  10. SAP License:一个关于交叉表的问题
  11. 中国移动创新系列丛书《OPhone应用开发权威指南》读者交流活动
  12. java 数据结构 pdf_数据结构java版本.pdf
  13. 雷石服务器不显示加密狗,ESXi服务器不识别USB加密狗怎么办
  14. 比较流行的日志分析软件
  15. SEO优化工具,查询死链VisualSEOStudio-2.0.2.3
  16. 微信小游戏开发实战教程3-绘制网格
  17. oracle表空间扩容asm,oracle表空间文件系统迁移到ASM
  18. 微软拼音输入法 linux,微软称Linux将会消失 后者回应将反击
  19. 【总结】利用AWS搭建混合云的架构
  20. pandownload下载完成却找不到所下载的文件 解决方法

热门文章

  1. 搭建短视频被动收益系统的资源网站,实现月入过万
  2. ledkvm切换器结构大变样:采用双滑轨设计,更易用
  3. “复制”马斯克(三):我们要为他的“反智事业”买单吗?
  4. When you believe
  5. html制作考卷,手把手教你如何制作试卷模板
  6. IIS三种应用程序池回收方法(保姆级教程)
  7. 【云和恩墨】嵌入云端:12c Policy-Managed Cluster为Oracle DBaaS助力
  8. Python办公自动化学习笔记--Word操作
  9. 语音情感识别--语音(声音的预处理)
  10. ST-LINK/V2驱动下载与安装