本文作为开篇必然要交代一些事情,第一是语言的选择上是swift,第二是iOS版本兼容上8.0+。swift3.0已经基本稳定,swift是未来趋势也是个人趋势。至于iOS版本,苹果官方显示iOS9以上的用户已经占到98%了,况且鹅厂的QQ和微信已经放弃8.0-,我想没有哪个公司有理由坚持了(如果有请告诉我?)。 所以,系列文章的开发环境都是swift3.1+Xcode8.3.3,适配系统iOS8.0+。 对于专业名词和其他翻译不好的名词会使用英文或者附带英文。

简介

UIApplication类为在iOS系统中运行的应用提供了一个集中的控制和协调点,也就是说UIApplication对象是iOS系统与应用程序中其他对象交互的桥梁。每个应用程序都有一个UIApplication的实例。当应用程序启动时,系统调用UIApplication(:::)函数创建一个单例对象。在其他地方可以通过shared方法访问该对象。

应用程序对象的主要任务是处理传入的用户事件的初始路由。它通过控制器对象(UIControl类的实例)向适当的目标对象发送操作消息。应用程序对象维护一个开放的窗口列表,通过这可以检索任何UIView对象。

UIApplication 类定义了一个符合UIApplicationDelegate协议的委托,并且必须实现一些协议方法。应用程序对象会通知重要的运行时事件的委托,例如应用启动、低内存警告和应用程序终止,使app本身有机会做出合适的响应。

通过openURL(_:)方法应用程序可以协调处理一些如email或image等文件资源。例如一个应用使用电子邮件地址调用该方法会导致邮件应用启动并且显示一些信息。 这些api允许你管理特定的设备行为,可以使用UIApplication对象实现以下行为:

  • 临时拦截传入的触摸事件:beginIgnoringInteractionEvents()
  • 注册推送通知
  • 触发undo-redo UI
  • 确定是否安装了一个已注册的应用程序来处理一个URL方案:canOpenURL(_:)
  • 延长应用程序的执行,这样它就可以在后台完成任务:beginBackgroundTask(expirationHandler:) , beginBackgroundTask(withName:expirationHandler:)
  • 设定和取消本地通知: scheduleLocalNotification(:) , cancelLocalNotification(:)
  • 执行应用级的状态恢复:

大多数应用都不需要子类化UIApplication,只需要使用应用程序代理来管理应用程序和系统的交互。如果需要在系统处理之前就处理事件,这是很罕见的,你可以实现自定义的事件调度机制。继承自UIApplication,然后重写sendEvent(_:)或者sendAction(_:to:from:for:)方法。处理完记得调用[super sendEvent:event]恢复该事件的调度循环。

获取应用程序单例

定义

class var shared: UIApplication { get }
复制代码

实质上,应用程序对象是在函数 UIApplicationMain(_:_:_:_:) 中创建的。这个函数中做了很多事情,实例化应用程序类,设置应用程序委托,还设置了主事件循环the main event loop,包含应用程序的运行循环application’s run loop,并开始处理事件。如果info.plist中设置了需要加载的主nib文件,并且nib文件可用则会加载nib。

应用程序代理和生命周期

  1. 应用程序代理

多数情况下应用程序代理是唯一获取应用程序状态变化等重要通知的唯一方式。 AppDelegate是单例根对象。尽管UIApplication完成了大部分的底层工作,但应该实现AppDelegate的多数或者全部的代理方法来决定应用的总体行为。 应用程序代理扮演了一个非常重要的角色:

  • 包含了应用程序的启动代码
  • 对应用程序状态的变化做出响应
  • 响应外来通知,如低内存警告、下载完成等通知
  • 决定状态的保存和恢复是否 应该发生,并在需要的情况下协助保存和恢复过程。 您可以使用它来存储应用程序的中央数据对象或任何没有拥有视图控制器的内容。

应用委托在启动时执行的一些额外任务包括以下内容:

  • 查看启动选项字典,以确定你的应用程序启动的原因 application(_:willFinishLaunchingWithOptions:)方法和 application(_:didFinishLaunchingWithOptions:)方法均提供了一个字典指示app启动的原因
  • 确定状态恢复是否应该进行,如果应用程序保存了视图控制器的状态,那么只有在应用程序代理方法application(_:shouldRestoreApplicationState:)返回为true时才会恢复之前的状态。
  • 注册远程通知
  • 处理URL
  • 提供根窗口对象

应用程序启动时传递过来的字典,让我们在程序启动时调整应用程序界面展示的内容。比如接收到远程通知启动时需要展示通知内容。

  1. 管理应用程序状态变化(生命周期) 应用委托的主要工作之一是响应系统报告的状态转换。对于发生的每一个状态更改,系统调用应用委代理的对应方法。每个状态都有不同的规则来管理应用程序的表现,应用代理必须相应地调整应用程序的行为。
  • 没有运行(Not running) 应用程序没有打开或者被终止
  • 不活跃(Inactive) 应用程序在前台运行但是不接收事件。一般情况下这个状态都是短站停留,很快进入后台或者变为活跃状态。
  • 活跃(Active) 应用程序在前台运行,并且接收事件,对用户行为做出响应。
  • 后台(Background) 应用程序仍在执行代码但是在屏幕上已不可见。当用户退出应用程序时,系统会在应用挂起前将应用程序短暂地转移到后台状态。其他情况下系统也会将应用程序直接登录到后台状态,或者将应用程序从挂起状态唤醒,并给他处理特定任务的时间。比如后台下载,特定的定位,远程通知等。 在后台处理的任务应该尽量少,尽快将控制权交还给系统
  • 暂停/挂起(Suspended) 应用还在内存中但是不执行任何代码。系统会挂起在后台没有待完成任务的应用。系统可能会为其他应用腾出空间而随时清理处于挂起状态的应用。

应用程序状态变化时调用的代理方法

  • 登入时(Launch time)

    • application(_:willFinishLaunchingWithOptions:) 启动过程开始,状态恢复还未发生

      optional func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
      复制代码

      返回值:当应用无法处理URL资源或者继续用户活动时,返回值为false。如果应用程序是因为远程通知而启动的那么返回值会被忽略

二少爷的Review第一集UIApplication相关相关推荐

  1. 进击的python【第一集】

    进击的python[第一集] 1.环境安装 安装python Windows平台安装py的时候要记住安装的位置,方便制定PATH 官网下的安装包可以安装可以卸载 windows制定配置文件路径 C:\ ...

  2. 华为GT3第一集-安装HAP

    Flag: 华为GT3第一集-安装HAP 华为GT3第二集-程序员必备软件之心率异常自动保存代码介绍 华为GT3第三集-心率异常自动保存代码之环境搭建 华为GT3第四集-心率异常自动保存代码之页面布局 ...

  3. python糖葫芦_进击的python【第一集】

    进击的python[第一集] 1.环境安装安装python Windows平台安装py的时候要记住安装的位置,方便制定PATH 官网下的安装包可以安装可以卸载 windows制定配置文件路径 C:\P ...

  4. Redis第一集:Windows下安装Redis和测试

    Redis第一集:Windows下安装Redis和测试 一.资源 Windows下的Redis的下载地址 点击这里即可下载,如果进不去GitHub的话,可以上网搜一下怎么进GitHub,搭个梯子(●ˇ ...

  5. LaTeX入门第一集!LaTeX下载资源分享!LaTeX教学资源分享!TeXstudio下载资源分享!

    LaTeX入门第一集!LaTeX下载资源分享!LaTeX教学资源分享!TeXstudio下载资源分享! 一.下载资源 以下提取码均为210916 LaTex下载资源(腾讯微云版) LaTex下载资源( ...

  6. Git入门第一集!(Git的下载地址、下载资源)

    Git入门第一集!(Git的下载地址.下载资源) 一.Git环境下载 Git官网下载地址 Git淘宝镜像地址 二.基本的Linux命令(用于GitBash) 1)cd : 改变目录. 2)cd . . ...

  7. 第一集 企业IT体系结构

    第一集 企业IT体系结构<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" / ...

  8. 并查集的相关知识详解 Come baby!!!

    一:并查集的相关知识 这道题用到了并查集,所以我就学了一下并查集,所以把自己的见解也分享给大家(建议 先看视频 再浏览 博客 再自己敲一遍 学习效率高而已,我总是乱着来 以为看几篇博客就会了,其实最后 ...

  9. 跟我一起学jQuery——第一集

    <锋利的JQuery>第二版阅读笔记-第一章 跟我一起学jQuery--第一集 jQuery对象和DOM对象 jQuery的优势与特点 Hello World! jQuery对象和DOM对 ...

最新文章

  1. c语言有重复元素全排列,【求助】全排列 不重复 由小到大 输出 代码
  2. 二维动画作品_动画设计丨从设计到制作,你不知道的东西还有很多......
  3. 磁盘调度 FCFS、SSTF、SCAN 算法c++实现(大学生专用)
  4. 数据结构的简单理解(4)
  5. Java 9 –终极功能列表
  6. 【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 )
  7. centos7.3部署django用uwsgi和nginx[亲测可用]
  8. IE6不支持hover赋予css样式的解决方法 如div:hover li:hover支持
  9. matlab slope函数,Matlab常用函数汇总
  10. js数据结构与算法--单链表的实现与应用思考
  11. 面试官:设计一个对外的接口,需要考虑那些安全问题?我有点懵...
  12. 在C#中如何将多个rtf文件内容组合在一起用一个rtf文件保存?
  13. 详细的log4j配置使用流程
  14. 基于单片机步进电机控制器设计(正转反转指示灯挡位)
  15. word一级标题行距一样宽度不一致
  16. 论文速读之A New Framework Based on Spatio-Temporal Information for Enhancing Compressed Video
  17. 【Java】月份枚举
  18. Android pda出入库管理,WMS+PDA扫描出入库管理系统
  19. win7 iis php mysql_windows7和iis配置的php phpinfo()中没有mysql组件
  20. 视频号计划,撑得起微博下一个十年?

热门文章

  1. matlab sdm,SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇
  2. Linux Kernel编程 --- Mailbox驱动框架
  3. 梦已破碎了,该往何处走?
  4. 容灾数据复制技术的比较
  5. mysql ceiling_mysql ceil() /ceiling()函数实例 - ceil
  6. js判断密码是否为键盘排序密码
  7. 常山浙西计算机学校,常山这几所学校要大变样了,有不少亮点哦!
  8. 基于SSM的在线教育系统的设计与实现【附源码】
  9. 斗鱼直播flash怎么切换html5,GitHub - spacemeowx2/DouyuHTML5Player: 替换斗鱼的Flash弹幕播放器...
  10. iPhone 4s手机内部构造