我所知道的UIApplication

前言

每一个应用程序都有一个 UIApplication 或其子类型的实例。当程序被加载,函数方法 UIApplicationMain 就被调用执行,它创建了单件模式的 UIApplication对象。这篇博客会主要写写我对 UIApplication 的了解。

什么是 UIApplication

我是这么简单的概括 UIApplication 的:

  1. UIApplication 对象是与我们的应用程序一一对应的。

  2. UIApplication 在运用程序中是以 单例 的形式存在。

  3. iOS 程序启动第一个创建的对象就是 UIApplication

  4. 我们常常会利用 UIApplication 来做一些应用级别的操作。

从 UIApplication 的创建开始说起

程序的运行往往会起始于 main 函数,iOS 也不例外。在我们的工程文件目录底下会 mian.m 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
// main.m
// TestForOC
//
// Created by lz on 15/7/27.
// Copyright (c) 2015年 lz. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

这个默认的iOS程序就是从 main 函数开始执行的,但是在main函数中我们其实只能看到一个方法,这个方法内部是一个消息循环(相当于一个死循环),因此运行到这个方法 UIApplicationMain 之后程序不会自动退出,而只有当用户手动关闭程序这个循环才结束。这个方法有四个参数:

  • 第一个参数和第二个参数其实就是main函数的参数,分别代表:参数个数、参数内容;

  • 第三个参数代表UIApplication类(或子类)字符串,这个参数默认为nil则代表默认为UIApplication类,用户可以自定义一个类继承于这个类;如果为nil则等价于NSStringFromClass([UIApplication class]),大家可以自己试验,效果完全一样;

  • 第四个参数是UIApplication的代理类字符串,默认生成的是AppDelegate类,这个类主要用于监听整个应用程序生命周期的各个事件,当UIApplication运行过程中引发了某个事件之后会调用代理中对应的方法;

也就是说当执行 UIApplicationMain 方法后这个方法会根据第三个参数创建对应的 UIApplication 对象,这个对象会根据第四个参数 AppDelegate 创建并指定此对象为UIApplication的代理;同时UIApplication会开启一个消息循环不断监听应用程序的各个活动,当应用程序生命周期发生改变 UIApplication 就会调用代理对应的方法。

这就是 UIApplication 诞生的地方啦~

UIApplication 的使用

由于 UIApplication 是单例模式,所以我们不能和使用正常的类一样去 alloc、init 它,只能通过以下的方法对它进行调用:

1
2
//
[UIApplication sharedApplication];

常用有以下属性:

  • delegate 属性获取UIApplicationDelegate实现类的实例
  • windows 属性获取当前程序涉及到窗口类数组
  • keyWindow 属性获取当前程序关键窗口

可以做的应用级的操作有哪些

在官方文档中,我们可以知道, UIApplication 能做的事情还是很多的,像我们会经常使用的:

1.设置icon上的数字图标

1
2
//设置主界面icon上的数字图标
[UIApplicationsharedApplication].applicationIconBadgeNumber = 4;

2.判断程序运行状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 //判断程序运行状态

/*

UIApplicationStateActive,

UIApplicationStateInactive,

UIApplicationStateBackground

*/


if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){

NSLog(@"程序在运行状态");

}

3.阻止屏幕变暗进入休眠状态

1
2
3
//阻止屏幕变暗,缺省为no, 慎重使用本功能,因为非常耗电。

[UIApplicationsharedApplication].idleTimerDisabled =YES;

4.显示联网状态

1
2
3
//显示联网标记 

[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;

5.发送电子邮件

1
2
3
4
5
6
7
8
9
NSString *recipients = @"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";

NSString *body = @"&body=It is raining in sunny California!";

NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];

email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];

6.打电话到一个号码

1
2
3
// Call Google 411

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];

7.发送短信

1
2
3
// Text to Google SMS

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

8.打开一个网址

1
2
3
// Lanuch any iPhone developers fav site

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

UIApplication Delegate

上面我们也提及了 AppDelegate,在项目底下我们会看到 AppDelegate 的类,它就是 UIApplication 的代理。 AppDelegate 默认已经遵守了 UIApplicationDelegate 协议,已经是 UIApplication 的代理。

这个类中定义了应用程序生命周期中各个事件的执行方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
//程序启动之后执行,只有在第一次程序启动后才执行,以后不再执行;

- (void)applicationWillResignActive:(UIApplication *)application;
//程序将要被激活时(获得焦点)执行,程序激活用户才能操作;

- (void)applicationDidEnterBackground:(UIApplication *)application;
//程序进入后台后执行,注意进入后台时会先失去焦点再进入后台;

- (void)applicationWillEnterForeground:(UIApplication *)application;
//程序将要进入前台时执行;

- (void)applicationDidBecomeActive:(UIApplication *)application;
//程序被激活(获得焦点)后执行,注意程序被激活时会先进入前台再被激活;

- (void)applicationWillTerminate:(UIApplication *)application;
//程序在终止时执行,包括正常终止或异常终止,例如说一个应用程序在后太运行(例如音乐播放软件、社交软件等)占用太多内存这时会意外终止调用此方法;

程序启动完整过程

前面讲了很多关于程序启动与初始化的东西,那也就顺带提一下,有关程序启动的完整过程,我大概画了一下:

后记

最近在实习中陆陆续续的修复了一些bug,get 到了不少知识点,过几天有机会可以整理成笔记分享出来~今天就到这了!买了预售的电影票~期待周末快快到来!