你的位置:首页 > 操作系统

[操作系统]1.0 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:UIUserNotificationTypeBadge16                      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  /* 状态栏样式 statusBarStyle15   UIStatusBarStyleDefault      状态栏为黑色16   UIStatusBarStyleLightContent    状态栏为白色17   UIStatusBarStyleBlackTranslucent18   UIStatusBarStyleBlackOpaque19  */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.h2 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 AppDelegate10 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

 

      
  



如有疑问,请发送邮件至 shorfng@126.com 联系我。
 
By:蓝田(Loto)