谈谈AppDelegate
谈谈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;
}
先看一下它的注释:在应用程序启动后,重写自定义点。这个是最直接的解释,一般在这里面,我做的操作如下:
- 不用故事板,自定义rootview
- 使用其他三方类库的时候在里面做一些初始化操作什么的。
参数
| 参数| 描述|
|-------------|----------------------------------------|
|application|你的app对象|
|launchOptions|一个指示app启动原因的字典(如果有)。这个字典也可能是空的在用户直接点击图标启动的情况下。例如当程序关闭,并且有推送消息过来的时候,通过点击推送打开app这个字典就包含推送过来的消息内容|返回值
如果app不能处理URL资源或者继续用户活动,就会返回NO,否则返回YES。如果app是通过远程推送启动的,那么这个返回值会被忽略。讨论
使用这个方法(包括与其相关的application: willFinishLaunchingWithOptions:)用于完成app的初始化和一些微调。这个方法在状态复位的时候调用,但是发生在app的window和其他UI展现之前。在某些情况下,当这个方法返回值之后,系统会调用其他的代理方法。(当用户进入前台状态或者后台状态的情况)。
如果你没有在application: willFinishLaunchingWithOptions:中处理launchOptions里面的key值,那么这个方法是你最后能够处理的地方。也就是说,你应该在这里对launchOptions里面的值提供合适的响应。注意
在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将要成为不活跃状态。
先看看它的自带的注释:当在程序将要从active状态到inactive状态的时候,会发(diao)送(yong)这个消(fang)息(fa)。这个发生的场景是程序被临时的打扰,例如打过来的电话或者是SMS信息。比如现在有电话进来,将会调用这个方法,还有就是有短信过来,然后你点击短信(3D touch)但是不进入程序的时候,也会去调用。或者是当用户退出程序,它开始转换到background state的时候。当app处于inactive状态的时候,它是继续运行的,但是不处理任何进来的事件响应。
讨论
你应该使用这个方法去暂停正在进行的任务、禁用timers、减小OpenGLES 帧速率。游戏的话需要使用这个方法来暂停游戏。在将要到active状态或者background状态的时候,inactive状态的app应该做最少的工作。
如果app使用了没有保存的用户数据,你应该在这个方法里面保存它确保它不丢失。然而,苹果还是强烈建议在合适的时间去保存你的数据。千万不要依赖特定的app状态来保存用户的data。
3 applicationDidEnterBackground:
它带参数是这样:
-(void)applicationDidEnterBackground:(UIApplication *)application {
}
告诉代理,app当前已经处于background(后台)。
先看看它自带的注释:使用这个方法释放公共资源、保存用户数据、取消定时器。并尽量存储应用程序状态信息,这样万一应用程序被终止了,将来可以恢复到当前状态。如果app支持在后台运行,那么用户退出时会调用这个方法而不是applicationWillTerminate方法。
讨论
除了这里面可以执行已经进入后台的操作,app还发出了一个UIApplicationDidEnterBackgroundNotification通知,因此如果有的类或者对象需要关注这个状态改变,可以去接收这个通知处理。
4 applicationWillEnterForeground:
它带参数是这样的:
-(void)applicationWillEnterForeground:(UIApplication *)application {
}
告诉代理,app将要进入前台。
先看看自带注释:这个方法会在应用程序从后台运行状态转换到活动状态的过程中被调用,可以在这里恢复应用程序正常运行所需信息。
讨论
这里也有一个UIApplicationWillEnterForegrounNotification的通知。
5 applicationDidBecomeActive:
它带参数是这样的:
-(void)applicationDidBecomeActive:(UIApplication *)application {
}
告诉代理,app已经成为active状态。
先看看自带注释:重启应用程序在非活动状态时被暂停(或尚未启动)的任务。如果程序之前在后台运行,那么可以选择是否刷新用户界面。
讨论
当打电话的时候,程序会调用applicationWillResignAction:方法,当挂断电话之后,程序会调用此方法。
同样也有一个UIAppicationDidBecomeActiveNotification通知。
6 applicationWillTerminate:
它带参数是这样的:
-(void)applicationWillTerminate:(UIApplication *)application {
}
告诉代理方法,app将要终止。
先看看自带注释:程序将要终止时会调用该方法。尽可能保存需要的数据。
讨论
这里面也有一个通知: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在后台,但是没有执行的代码)

附
参考链接
谈谈AppDelegate的更多相关文章
- ios成长之每日一遍(day 1)
Hello world开始. 这里不讨论如何创建项目导入项目.由于趁上班时间打酱油所以也不谈细节, 只谈具体项目的实现与关键流程的解析, 只供本人实际程况使用.不喜请移驾. 首先来谈谈 AppDele ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
随机推荐
- .NET平台机器学习资源汇总,有你想要的么?
接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分用过的 ,会有稍微详细点的说明,其他没用过的, ...
- 数据可视化-EChart2.0使用总结1
图表是企业级Web开发必不可少的一个功能点.也是“数据可视化的一个具体呈现”.今天看到阮一峰翻译的“数据可视化:基本图表”一文,同时梳理一下公司现在项目使用的EChart2.0类库.阮一峰的文章同时也 ...
- 应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较
本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较. 领域实体为何不能一统江湖? 当你阅读 ...
- MVVM 开发的几种模式讨论(WPF)
在WPF系(包括SL,WP或者Win8)应用开发中,MVVM是个老生常谈的问题.初学者可能不会有感觉,但当你写一个核心逻辑能在各种平台上无缝移植,而只需改改UI的时候,那种快感是无法用语言来形容的. ...
- geotrellis使用(六)Scala并发(并行)编程
本文主要讲解Scala的并发(并行)编程,那么为什么题目概称geotrellis使用(六)呢,主要因为本系列讲解如何使用Geotrellis,具体前几篇博文已经介绍过了.我觉得干任何一件事情基础很重要 ...
- Service组件简介
Service是一个应用程序组件,没有图形化界面,通常用来处理一些耗时较长的操作,可以用Service更新ContentProvider,发送Intent以及启动系统的通知等等.Service并不是一 ...
- Cookie中的几个概念
1. Domain Domain表示Cookie所在的域(如:www.baidu.com),对于Cookie的访问是不能跨域的(如:我们无法在www.baidu.com下访问www.google.co ...
- [VB.NET]调用API获取/设置键盘按键状态
1.调用GetAsyncKeyState()获取指定按键的状态,GetActiveKey()检索指定范围内的按键状态 2.调用keybd_event()可合成一次击键事件,通常两次击键事件间需要设定时 ...
- JS围棋半成品
// = 0 && cheseArray[x][y-1] == chessState.None){ return true; } if(y + 1 = 0 &&ches ...
- CSS3橙色的星球绕轨道公转动画
效果:http://hovertree.com/texiao/css3/24/ 效果图: 代码如下: <!DOCTYPE html> <html lang="zh" ...