谈谈AppDelegate
前言

每个iOS程序都会有一个AppDelegate的类,这个类就是一个代理类,我们新建一个Project的时候,里面都会带有这个类。现在就让我们看看这个类。

开始介绍

对于AppDelegate,它的父类是UIResponder,然后实现了UIApplicationDelegate协议,这里的方法多是协议里面的方法,先看看默认的都有哪些方法。

1 application:didFinishLaunchingWithOptions:

它带参是这样的:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
  1. 先看一下它的注释:在应用程序启动后,重写自定义点。这个是最直接的解释,一般在这里面,我做的操作如下:

    • 不用故事板,自定义rootview
    • 使用其他三方类库的时候在里面做一些初始化操作什么的。
  2. 参数

    | 参数| 描述|

    |-------------|----------------------------------------|

    |application|你的app对象|

    |launchOptions|一个指示app启动原因的字典(如果有)。这个字典也可能是空的在用户直接点击图标启动的情况下。例如当程序关闭,并且有推送消息过来的时候,通过点击推送打开app这个字典就包含推送过来的消息内容|

  3. 返回值

    如果app不能处理URL资源或者继续用户活动,就会返回NO,否则返回YES。如果app是通过远程推送启动的,那么这个返回值会被忽略。

  4. 讨论

    使用这个方法(包括与其相关的application: willFinishLaunchingWithOptions: )用于完成app的初始化和一些微调。这个方法在状态复位的时候调用,但是发生在app的window和其他UI展现之前。在某些情况下,当这个方法返回值之后,系统会调用其他的代理方法。(当用户进入前台状态或者后台状态的情况)。

    如果你没有在application: willFinishLaunchingWithOptions: 中处理launchOptions里面的key值,那么这个方法是你最后能够处理的地方。也就是说,你应该在这里对launchOptions里面的值提供合适的响应。

  5. 注意

    在UIApplicationDelegate中还有一个方法叫做:

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

当程序初始化的时候,强烈建议去使用:

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

or

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

那个applicationDidFinishLaunching:方法是个老版本iOS上使用的。

2 applicationWillResignActive:

它带参是这样的:

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

告诉代理,app将要成为不活跃状态。

  1. 先看看它的自带的注释:当在程序将要从active状态到inactive状态的时候,会发(diao)送(yong)这个消(fang)息(fa)。这个发生的场景是程序被临时的打扰,例如打过来的电话或者是SMS信息。比如现在有电话进来,将会调用这个方法,还有就是有短信过来,然后你点击短信(3D touch)但是不进入程序的时候,也会去调用。或者是当用户退出程序,它开始转换到background state的时候。当app处于inactive状态的时候,它是继续运行的,但是不处理任何进来的事件响应。

  2. 讨论

    你应该使用这个方法去暂停正在进行的任务、禁用timers、减小OpenGLES 帧速率。游戏的话需要使用这个方法来暂停游戏。在将要到active状态或者background状态的时候,inactive状态的app应该做最少的工作。

    如果app使用了没有保存的用户数据,你应该在这个方法里面保存它确保它不丢失。然而,苹果还是强烈建议在合适的时间去保存你的数据。千万不要依赖特定的app状态来保存用户的data。

3 applicationDidEnterBackground:

它带参数是这样:

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

告诉代理,app当前已经处于background(后台)。

  1. 先看看它自带的注释:使用这个方法释放公共资源、保存用户数据、取消定时器。并尽量存储应用程序状态信息,这样万一应用程序被终止了,将来可以恢复到当前状态。如果app支持在后台运行,那么用户退出时会调用这个方法而不是applicationWillTerminate方法。

  2. 讨论

    除了这里面可以执行已经进入后台的操作,app还发出了一个UIApplicationDidEnterBackgroundNotification通知,因此如果有的类或者对象需要关注这个状态改变,可以去接收这个通知处理。

4 applicationWillEnterForeground:

它带参数是这样的:

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

告诉代理,app将要进入前台。

  1. 先看看自带注释:这个方法会在应用程序从后台运行状态转换到活动状态的过程中被调用,可以在这里恢复应用程序正常运行所需信息。

  2. 讨论

    这里也有一个UIApplicationWillEnterForegrounNotification的通知。

5 applicationDidBecomeActive:

它带参数是这样的:

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

告诉代理,app已经成为active状态。

  1. 先看看自带注释:重启应用程序在非活动状态时被暂停(或尚未启动)的任务。如果程序之前在后台运行,那么可以选择是否刷新用户界面。

  2. 讨论

    当打电话的时候,程序会调用applicationWillResignAction:方法,当挂断电话之后,程序会调用此方法。

    同样也有一个UIAppicationDidBecomeActiveNotification通知。

6 applicationWillTerminate:

它带参数是这样的:

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

告诉代理方法,app将要终止。

  1. 先看看自带注释:程序将要终止时会调用该方法。尽可能保存需要的数据。

  2. 讨论

    这里面也有一个通知:UIApplicationWillTerminateNotification。

方法执行顺序

这里没有列出所有的方法,只是最常用的几个方法。

1 当我们第一次打开程序的时候,执行结果如下:

2016-11-08 17:56:57.670768 CategoriesDemo[3722:737434] application:didFinishLaunchingWithOptions:
2016-11-08 17:56:57.675868 CategoriesDemo[3722:737434] applicationDidBecomeActive:

2 当程序进入后台的时候,执行结果如下:

2016-11-08 17:59:46.082466 CategoriesDemo[3722:737434] applicationWillResignActive:
2016-11-08 17:59:46.607901 CategoriesDemo[3722:737434] applicationDidEnterBackground:

3 当程序进入前台的时候,执行结果如下:

2016-11-08 18:00:27.726073 CategoriesDemo[3722:737434] applicationWillEnterForeground:
2016-11-08 18:00:28.143117 CategoriesDemo[3722:737434] applicationDidBecomeActive:

4 当有电话进来的时候(程序在前台的时候),执行结果如下:

2016-11-08 18:03:29.891976 CategoriesDemo[658:224868] applicationWillResignActive:

5 当挂掉电话的时候,执行结果如下:

2016-11-08 18:03:35.344466 CategoriesDemo[658:224868] applicationDidBecomeActive:

这里插一句:也就是当程序在前台的时候,来电话,会执行applicationWillResignActive:方法。当电话挂掉时候,就会执行applicationDidBecomeActive:方法。

总结

1 应用程序运行状态有以下几种:

  • Not running (app没有启动或者已经启动但是被系统终结)
  • Inactive(app在前台,但是当前没有接收事件)
  • Active (app正在前台运行并且接收事件)
  • Background (app在后台,执行代码)
  • Suspended (app在后台,但是没有执行的代码)

参考链接

1 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

谈谈AppDelegate的更多相关文章

  1. ios成长之每日一遍(day 1)

    Hello world开始. 这里不讨论如何创建项目导入项目.由于趁上班时间打酱油所以也不谈细节, 只谈具体项目的实现与关键流程的解析, 只供本人实际程况使用.不喜请移驾. 首先来谈谈 AppDele ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  4. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  5. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  6. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  7. 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  9. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

随机推荐

  1. 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)

    通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...

  2. 关于SubSonic3.0未处理InvalidOperationException异常(关键字TOP附近有语法错误)的处理

    早上在测试程序时,使用了Top这个属性,没想到马上抛出了个“未处理InvalidOperationException异常(关键字'TOP'附近有语法错误)”这个错误提示,见下图: 然后Debug一下, ...

  3. web前端基础知识总结

    上个寒假总结的web前端的一些知识点给大家分享一下 1.<html>和</html> 标签限定了文档的开始和结束点. 属性: (1)  dir: 文本的显示方向,默认是从左向右 ...

  4. svn 几个常用命令(持续更新)

    1:获取某个版本号(3583)下的代码                                               svn co http://tech.yoai.com:8300/c ...

  5. css学习--css基础

    学习慕课网笔记,课程:http://www.imooc.com/code/2024 1.css选择器 子选择器:parent>child 子选择器是指选择parent的范围内的第一个子元素.这里 ...

  6. 初次使用AngularJS中的ng-view,路由控制

    AngularJS中的route可以控制页面元素的改变,使多页面变成一个单页面 第一步:引入必要的js: <script src="js/lib/angular.js"> ...

  7. Sql Server之使用T_SQL创建,修改,查看数据库信息

    一.使用Transact_SQL创建数据库 Transact_SQL语法如下:  create database database_name   [ on     [primary]  [<fi ...

  8. 8.2 使用Fluent API进行实体映射【Code-First系列】

    现在,我们来学习怎么使用Fluent API来配置实体. 一.配置默认的数据表Schema Student实体 using System; using System.Collections.Gener ...

  9. ArcGIS10.2 应用服务器搭建

    操作系统:Windows Server2012R2 DataCenter 软件环境:ArcGIS Desktop10.2,ArcSDE10.2,ArcGIS Server10.2,win64_11gR ...

  10. MySQL 相关总结

    MySQL 优秀在线教程 RUNOOB-SQL 教程 MySQL 常用命令 导出操作 -- 某数据库 全部表 结构和数据 mysqldump -h192.168.8.152 -uroot -p man ...