zoukankan      html  css  js  c++  java
  • 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: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
          
     
     


    如有疑问,请发送邮件至 shorfng@126.com 联系我。
     
    By:蓝田(Loto)
     
     
  • 相关阅读:
    用最简单的例子理解装饰器模式(Decorator Pattern)
    用最简单的例子理解迭代器模式(Iterator Pattern)
    用最简单的例子理解观察者模式(Observer Pattern)
    用最简单的例子理解单例模式(Singleton Pattern)
    用最简单的例子理解对象为Null模式(Null Object Pattern)
    用最简单的例子理解策略模式(Strategy Pattern)
    使用Lazy<T>实现对客户订单的延迟加载
    C#关键字var是什么,在何种情况下使用
    C#中的IDisposable模式
    CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
  • 原文地址:https://www.cnblogs.com/shorfng/p/5143804.html
Copyright © 2011-2022 走看看