谈谈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. eclipse将android项目生成apk并且给apk签名

    转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...

  2. Web APi之认证(Authentication)两种实现方式后续【三】(十五)

    前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...

  3. jQuery 自带的动画效果

    1.方法: show:显示选中元素. hide:隐藏选中元素. toggle:显示或隐藏选中元素. fadeIn:将选中元素的不透明度逐步提升到100%. fadeOut:将选中元素的不透明度逐步降为 ...

  4. Lua 性能相关笔记

    1.创建一个闭合函数要比创建一个table更廉价,访问非局部的变量也比table字段更快. 2.访问局部变量要比全局变量更快,尽可能的使用局部变量,可以避免无用的名称引入全局环境. 3.do-end语 ...

  5. JavaMail基础案例开发

    Java邮件开发案例 所需jar包有:mailapi.jar,smtp.jar 一.单独邮件发送案例 package com.itRed.javamail; import java.util.Prop ...

  6. Service组件简介

    Service是一个应用程序组件,没有图形化界面,通常用来处理一些耗时较长的操作,可以用Service更新ContentProvider,发送Intent以及启动系统的通知等等.Service并不是一 ...

  7. 【LeetCode】Counting Bits(338)

    1. Description Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num ...

  8. 资源等待类型sys.dm_os_wait_stats

    动态管理视图  sys.dm_os_wait_stats 返回执行的线程所遇到的所有等待的相关信息.可以使用该聚合视图来诊断 SQL Server 以及特定查询和批处理的性能问题. 列名 数据类型 说 ...

  9. C#的Socket实现UDP协议通信

    今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...

  10. Redis和Memcached整体

    Redis和Memcached整体对比 Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较,总体来看还是比较客观的,现总结如下: 1)性能对比:由于R ...