UIApplication对象特点:

特点1:
  • UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序,而且是单例的。(用来封装整个应用程序的一个对象, 比如当应用程序执行到某个时期要做什么, 生命周期等。)
  • 获取UIApplication对象:[UIApplication sharedApplication]
  • 一个iOS程序启动后,创建的第一个对象就是UIApplication对象,且只有一个。
举例:通过代码获取两个UIApplication对象,打印地址可以看出地址是相同的。
 
 1 - (void)viewDidLoad {
2 [super viewDidLoad];
3
4 //获取app对象 证明了一个应用程序中只有一个UIApplication对象
5 UIApplication *app1 = [UIApplication sharedApplication];
6
7 UIApplication *app2 = [UIApplication sharedApplication];
8 NSLog(@"app1=%p ---- app2 = %p", app1, app2);
9
10 }
打印结果:
2015-12-02 13:34:58.847 01 UIApplication[4563:852645] app1=0x7fe2b3e0eaa0 ---- app2 = 0x7fe2b3e0eaa0
 
特点2:
  • 每一个应用都有自己的UIApplication对象,而且是单例的。
  • 如果试图在程序中新建一个UIApplication对象,那么将报错提示。
举例:
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3
4 //通过alloc+ init 创建一个UIApplication对象,会报异常
5 UIApplication *app = [[UIApplication alloc] init];
6
7 NSLog(@"%p", app);
8 }
打印结果:
2015-12-02 13:39:00.270 01 UIApplication[4675:867735] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
 
特点3:
  • 利用UIApplication对象,能进行一些应用级别的操作
(1)应用图标显示数字 (详见1.1 常用属性)
(2)状态栏上的等待图标指示器 (详见1.1 常用属性)
(3)利用UIApplication打开某个资源 (openURL:方法)
✓系统会自动根据协议识别使用某个app打开
 
 1 //打开一个网页 :
2 [app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];
3
4 //打电话
5 [app openURL:[NSURL URLWithString:@"tel://10086"]];
6
7 //发短信
8 [app openURL:[NSURL URLWithString:@"sms://10086"]];
9
10 //发邮件
11 [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];
12
 
✓使用openURL方法也可以打开其他应用,在不同应用之间互相调用对方。
 美图秀秀, 点击分享到"新浪微博", 打开"新浪微博"选择账号, 跳转回"美图秀秀", 开始分享
 喜马拉雅, 使用微博、QQ 账号 登录。都需要应用程序间跳转。
(4)通过UIApplication管理状态栏 (详见1.2 管理状态栏)
 
 
1.1 — 常用属性
UIApplication的常用属性
 1 //应用程序图标右上角的红色提醒数字(默认为0)
2 @property(nonatomic) NSInteger applicationIconBadgeNumber;
3
4 举例:
5
6 - (void)viewDidLoad {
7 [super viewDidLoad];
8
9 //获取单例对象
10 UIApplication *app = [UIApplication sharedApplication];
11
12 // 创建用户通知设置 (iOS8 后要求设置通知的时候必须经过用户许可)
13 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
14 UIUserNotificationSettings *settings =
15 [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge
16 categories:nil];
17 //注册权限
18 [app registerUserNotificationSettings:settings];
19 }
20
21 //设置数字
22 app.applicationIconBadgeNumber = 10;
23
24 }
 
 
 1 //联网指示器的可见性 (默认为 no)
2 @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
3 举例:
4
5 - (void)viewDidLoad {
6 [super viewDidLoad];
7
8 //获取单例对象
9 UIApplication *app = [UIApplication sharedApplication];
10
11 //设置网络指示器
12 app.networkActivityIndicatorVisible = YES;
13
14 }
 
1.2 — 管理状态栏
系统提供了2种管理状态栏的方式

1.通过UIViewController管理(iOS 7以后)(每一个UIViewController都可以拥有自己不同的状态栏)(推荐)

 1 //状态栏的样式
2 -(UIStatusBarStyle)preferredStatusBarStyle;
3
4 //状态栏的可见性
5 -(BOOL)prefersStatusBarHidden;
6 // 状态栏可见性(默认为 no) --- UIViewController管理 (推荐使用)
7 - (BOOL)prefersStatusBarHidden {
8 return NO;
9 }
10
11 //状态栏的样式 --- UIViewController管理 (推荐使用)
12 - (UIStatusBarStyle)preferredStatusBarStyle {
13
14 /* 状态栏样式 statusBarStyle
15 UIStatusBarStyleDefault 状态栏为黑色
16 UIStatusBarStyleLightContent 状态栏为白色
17 UIStatusBarStyleBlackTranslucent
18 UIStatusBarStyleBlackOpaque
19 */
20
21 return UIStatusBarStyleDefault;
22 }
2.通过UIApplication管理(iOS 6之前)
(1)在ios 7 以后如果要通过UIApplication管理,则首先要在Info.plist文件中增加一个配置项
  • key:View controller-based status bar appearance
  • value:NO
 1 //状态栏的样式 --- UIApplication管理
2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
3
4 //获取单例对象
5 UIApplication *app = [UIApplication sharedApplication];
6
7 //采用动画的效果设置状态栏的样式-由黑变白(过期)
8 [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
9
10 //隐藏状态栏
11 app.statusBarHidden = YES;
12
13 //采用动画的方式隐藏状态栏 (过期 ios 3.2弃用)
14 [app setStatusBarHidden:YES animated:YES];
15
16 /* withAnimation:方法 (过期)
17 UIStatusBarAnimationNone 无特效
18 UIStatusBarAnimationFade 淡出效果
19 UIStatusBarAnimationSlide 向上退出隐藏
20 */
21 [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
22 }
 
使用场合

 
UIApplication:状态栏的样式只设置一次,使用动画效果
UIViewController:状态栏是否隐藏,样式不一样
 
 
 
 1.3 — UIApplicationDelegate

引入

 
  • 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。
  • 比如一个来电或者锁屏会导致app进入后台甚至被终止,还有很多其它类似的情况会导致app受到干扰。
  • 在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让其处理这些系统事件。
delegate可处理的事件如:
  • 应用程序的生命周期事件(如程序启动和关闭)
  • 系统事件(如来电)
  • 内存警告
  • … …
 
 
简介:

 
  • 新建完项目以后的那个AppDelegate文件, 就是UIApplication的代理对象。
  • 该代理对象main函数中已经被设置好了, 无需我们手动设置了。
 
在main函数中进行的设置:
文件位置:Supporting Files —> main.m
 1 #import <UIKit/UIKit.h>
2 #import "AppDelegate.h"
3
4 int main(int argc, char *argv[]) {
5 @autoreleasepool {
6
7 //设置启动UIApplication对象, 和对应的代理对象AppDelegate
8 return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));
9 }
10 }
 
 
注意:

 
 AppDelegate的主要作用就是处理(监听)应用程序本身的各种事件
 要想成为UIApplication的代理对象, 必须遵守:UIApplicationDelegate协议
 
 
 
 
 
1.3.1 — 代理方法 

 
AppDelegate文件默认已经遵守了UIApplicationDelegate协议,已经是UIApplicationDelegate的代理
1 //  AppDelegate.h
2
3 #import <UIKit/UIKit.h>
4
5 @interface AppDelegate : UIResponder <UIApplicationDelegate>
6
7 @property (strong, nonatomic) UIWindow *window;
8
9 @end
 
 
处理(监听)应用程序本身的各种事件:

 1 //  AppDelegate.m
2
3 #import "AppDelegate.h"
4
5 @interface AppDelegate ()
6
7 @end
8
9 @implementation AppDelegate
10
11 // app启动完成 调用该方法 启动之后,将不再调用此方法!
12 // 如果因为内存等原因,应用程序被操作系统干掉,再次点击图标,会调用此方法!
13 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
14 NSLog(@"%s", __func__);
15 return YES;
16 }
17
18 // app即将退出活动状态的时候调用 (将要失去焦点:不能和用户交互)( 此方法在来电或来短信的时候被调用)
19 // 游戏应该再此方法中暂停游戏进程!此方法在游戏开发中尤为重要!
20 - (void)applicationWillResignActive:(UIApplication *)application {
21 NSLog(@"%s", __func__);
22 }
23
24 // app已经进入后台 调用该方法 (在此方法中保存应用程序的数据和状态)
25 // 应用程序退出到后台,释放共享资源,保存用户数据,停止时钟,保存足够的应用程序状态信息...
26 - (void)applicationDidEnterBackground:(UIApplication *)application {
27 NSLog(@"%s", __func__);
28 }
29
30 // app即将进入前台的时候 调用该方法 (在此方法中还原应用程序的数据和状态)
31 - (void)applicationWillEnterForeground:(UIApplication *)application {
32 NSLog(@"%s", __func__);
33 }
34
35 // app已经进入活动状态, 重新启动原来暂停的状态 (重新获取焦点:可以和用户交互)
36 - (void)applicationDidBecomeActive:(UIApplication *)application {
37
38 NSLog(@"%s", __func__);
39 }
40
41 // app接收到内存警告 调用该方法
42 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
43 NSLog(@"%s", __func__);
44 }
45
46 // app将要被杀死 调用该方法
47 // 注意:1.用户主动关闭 2.系统因为内存不够关闭了程序
48 - (void)applicationWillTerminate:(UIApplication *)application {
49
50 NSLog(@"%s", __func__);
51 }
52 @end

iOS之UIApplication详解的更多相关文章

  1. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  2. 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )

    原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...

  3. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  4. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  5. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  6. iOS开发:详解Objective-C runTime

    Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...

  7. iOS应用开发详解

    <iOS应用开发详解> 基本信息 作者: 郭宏志    出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...

  8. iOS开发者证书-详解

    iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密 ...

  9. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

随机推荐

  1. .Net 转战 Android 4.4 日常笔记(3)--目录结构分析

    看了创建项目后,出现的文件夹很多确实有点晕,不过经过简单的了解还是跟我们asp.net的目录有点相识滴. 下面这张图,概括了主要的文件用途.其实也只需要了解这几个就差不多了,知道在那里设计界面,那里写 ...

  2. OWIN 中 K Commands 与 OwinHost.exe 相等吗?

    OwinHost.exe: While some will want to write a custom process to run Katana Web applications, many wo ...

  3. ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

    问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...

  4. Sublime写MarkDown实时预览

    [TOC] Sublime写MarkDown实时预览 Sublime作为神器,实至名归. 首先 1.安装Sublime,并安装Package Control,这里不多说. 2.安装MarkDown P ...

  5. 【JAVA】基于MVC架构Java技术荟萃案例演练

    基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...

  6. hdu FatMouse's Speed 动态规划DP

    动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid ...

  7. MySQL的多存储引擎架构

    支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将 ...

  8. 匿名方法与Lambda表达式

    1.匿名方法 在学习委托时,我们知道委托实例至少要绑定一个方法才能使用,而调用委托实际上是调用了它所关联地方法.一般来说,需要定义一个与委托签名相符的方法,并使之与委托变量关联.如以下代码: Acti ...

  9. git学习之branch分支

    作为新手,站在我的角度肤浅的来理解,分支就是相当于开辟了一个新的临时工作区,在这个工作区进行文件代码改动,然后在合并到master主工作区,这样能保证主工作区的安全性和稳定性,对于团队协作尤为重要. ...

  10. [Tool] csdn客户端开发(非官方版)

    偶尔间看到一篇博客[清山博客]里讲述了他自己开发的一个CSDN博客客户端,并去下载体验了一下,然后就自己手痒也要开发一下 先看看结果图: 在文章列表里,鼠标右键可以操作[置顶.删除.评论权限]: 下面 ...