热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS之UIApplication详解

UIApplication对象特点:特点1:UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序,而且是单例的。(用来封装整个应用程
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 *)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 
 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 
4 
5 @interface AppDelegate : UIResponder 
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详解


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
KING逊咖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有