UIAPPlication

本文介绍了iOS中的`UIApplication`对象作用及其使用方法,包括设置应用提醒数字、联网状态、状态栏样式等,并详细讲解了如何模仿`UIApplication`创建单例对象,以及`UIApplicationDelegate`代理的应用场景和主要方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

## 什么是UIAPPlication

- `UIApplication`对象是应用程序的象征.

- 每个应用都有自己的`UIApplication`对象,这个对象是系统自动帮我们创建的, 它是一个单例对象.

- 个iOS程序启动后创建的第一个对象就是`UIApplication`对象- 我们只能通过[UIApplication sharedApplication]获得这个单例对象,不能够主动去创建它.

---

## UIApplication的作用

- 利用`UIApplication`对象,能进行一些应用级别的操作

- 可以设置应用程序图标右上角的红色提醒数字

- 设置联网指示器的可见性

- 可以设置应用陈旭的状态栏

- 进行应用之间的跳转

----

## UIApplication功能的实现

- 1.设置应用的提醒数字

```objc

- (void)viewDidLoad {

[super viewDidLoad];

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// 在设置之前, 要注册一个通知,从ios8之后,都要先注册一个通知对象.才能够接收到提醒.

UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

// 注册通知对象

[ap registerUserNotificationSettings:notice];

// 设置提醒数字

ap.applicationIconBadgeNumber = 10;

}

```

- 2.设置联网状态

```objc

- (void)viewDidLoad {

[super viewDidLoad];

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// 在设置之前, 要注册一个通知,从ios8之后,都要先注册一个通知对象.才能够接收到提醒.

UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];

// 注册通知对象

[ap registerUserNotificationSettings:notice];

// 设置提醒数字

ap.applicationIconBadgeNumber = 10;

// 设置联网状态

ap.networkActivityIndicatorVisible = YES;

}

```

- 3.设置状态栏

- 应用程序的状态栏,默认是交给控制器来管理的

- 控制器提供的办法,可以直接重写这个方法

- 在控制器当中设置状态栏样式

```objc

-(UIStatusBarStyle)preferredStatusBarStyle

{

return UIStatusBarStyleLightContent;

}

```

- 4.隐藏状态栏

- 通过控制器的方式

```objc

-(BOOL)prefersStatusBarHidden

{

return NO;

}

```

- 5.应用程序管理状态栏

- 通常在开发当中都是应用程序来管理状态栏,来做统一管理。不然的话,会有很多个控制器,非常麻烦

- 想要让应用程序来管理状态栏,要在info.plist当中进行配置

- 添加一个key值:是最后一个,`View controller-based status bar appearance` ,设置为NO,就是应用程序来管理状态栏了

```objc

- (void)viewDidLoad {

[super viewDidLoad];

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// 设置状态栏的样式

ap.statusBarStyle = UIStatusBarStyleLightContent;

// 设置状态栏隐藏

ap.statusBarHidden = YES;

}

```

- 6.跳转网页

```objc

- (IBAction)ali {

// 获取UIApplication对象

UIApplication *ap = [UIApplication sharedApplication];

// URL:协议头

// 域名 应用程序通过协议头的类型,去打开相应的软件.

// NSURL *url =[NSURL URLWithString:@"http://www.baidu.com"];

// [ap openURL:url];

// 打电话

[ap openURL:[NSURL URLWithString:@"tel://10086"]];

// 发短信

// [ap openURL:[NSURL URLWithString:@"sms://10086"]];

}

```

## 模仿UIApplication创建一个单例

### 要求

- 程序一启动就创建创建对象.

- 创建的对象只能通过share的方式获取对象.

- 不能够进行alloc 操作,当执行alloc时, 程序发生崩溃

### 程序一启动就创建对象

- 当类被加载到内存的时候就会调用`load`的方法,它会比`main`优先调用

- 想要保存创建的对象,要用成员属性,但是现在是类方法, 没有办法访问成员属性. 所以搞了一个static的静态变量来保存

```objc

static Persion *_instance;

+(void)load{// 创建对象 _instance = [[self alloc] init]; }

``` ### 保证调用alloc时会产生异常

- 重写系统的alloc方法

```objc

+(instancetype)alloc{// 当调 alloc 法时,先查看 下_instance有没有值,如果已经有值的话,直接抛出异常. if(_instance){ NSException *exception = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Persion instance." userInfo:nil];

// 抛出异常 [exception raise]; } // 保持系统的做法. return [super alloc];

}

```

### 通过share方式获取对象

- 创建一个`sharePerson`的类方法

```objc

+(instancetype)sharePersion

{ return _instance

}

```

---

## UIApplication代理

- 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终结。还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件, 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。

- UIApplication会在程序启动时创建一个遵守`UIApplicationDelegate`的代理.这个就是我们程序一创建时的`APPDelegate`类.`APPDelegate`类遵守了`UIApplicationDelegate`协议。

- 在这个类中定义了很多监听系统事件的方法.同时也定义了一些应用程序的生命周期方法。

### delegate可处理的事件包括

- 应用程序的生命周期事件(如程序启动和关闭)

- 系统事件(如来电)

- 内存警告- ...

### 主要方法

```objc

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

// 应用程序的生命周期方法

// 应用程序启动完成的时候调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

return YES;

}

// 当我们应用程序即将失去焦点的时候调用(不能进行人机交互)

- (void)applicationWillResignActive:(UIApplication *)application {

// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

}

// 当我们应用程序完全进入后台的时候调用

- (void)applicationDidEnterBackground:(UIApplication *)application {

// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

}

// 当我们应用程序即将进入前台的时候调用

- (void)applicationWillEnterForeground:(UIApplication *)application {

// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.

}

// 当我们应用程序完全获取焦点的时候调用。只有当一个应用程序完全获取到焦点,才能与用户交互.

- (void)applicationDidBecomeActive:(UIApplication *)application {

// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

}

// 当我们应用程序即将关闭的时候调用

- (void)applicationWillTerminate:(UIApplication *)application {

// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

}

@end

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值