美文网首页IOS三人行swift
iOS-UIApplication简介

iOS-UIApplication简介

作者: 面试小集 | 来源:发表于2015-11-02 15:22 被阅读110次

    ios 交流群:264706196

    参考:
    http://www.cnblogs.com/wendingding/p/3766347.html
    http://blog.sina.com.cn/s/blog_859ab336010166nd.html

    简单介绍

    • UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序。
    • 每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示。
    • 通过[UIApplication sharedApplication]可以获得这个单例对象
    • 一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个(通过代码获取两个UIApplication对象,打印地址可以看出地址是相同的)。
    • 利用UIApplication对象,能进行一些应用级别的操作

    应用级别的操作示例

    • 设置应用程序图标右上角的红色提醒数字(如QQ消息的时候,图标上面会显示1,2,3条新信息等。)
      @property(nonatomic) NSInteger applicationIconBadgeNumber;
      代码实现和效果:
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //创建并添加一个按钮
        UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 100, 60, 30)];
        [btn setTitle:@"按钮" forState:UIControlStateNormal];
        [btn setBackgroundColor:[UIColor brownColor]];
        [btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];
    }
    -(void)onClick
    {
        NSLog(@"按钮点击事件");
        //通过sharedApplication获取该程序的UIApplication对象
        UIApplication *app=[UIApplication sharedApplication];
        app.applicationIconBadgeNumber=123;
    }
    
    运行效果
    • 设置联网指示器的可见性
    @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
    

    代码和效果:

    app.networkActivityIndicatorVisible=YES;
    
    运行效果
    • 管理状态栏
      从iOS7开始,系统提供了2种管理状态栏的方式
      a) 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏).
      在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式
      状态栏的样式   - (UIStatusBarStyle)preferredStatusBarStyle;
      状态栏的可见性  -(BOOL)prefersStatusBarHidden;
    #pragma mark-设置状态栏的样式
    -(UIStatusBarStyle)preferredStatusBarStyle
    {
        //设置为白色
        //return UIStatusBarStyleLightContent;
        //默认为黑色
         return UIStatusBarStyleDefault;
    }
    #pragma mark-设置状态栏是否隐藏(否)
    -(BOOL)prefersStatusBarHidden
    {
        return NO;
    }
    

    b) 通过UIApplication管理(一个应用程序的状态栏都由它统一管理)
    如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置


    参考
    //通过sharedApplication获取该程序的UIApplication对象
        UIApplication *app=[UIApplication sharedApplication];
        app.applicationIconBadgeNumber=123;
        
        //设置指示器的联网动画
        app.networkActivityIndicatorVisible=YES;
        //设置状态栏的样式
        //app.statusBarStyle=UIStatusBarStyleDefault;//默认(黑色)
        //设置为白色+动画效果
          [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
        //设置状态栏是否隐藏
        app.statusBarHidden=YES;
          //设置状态栏是否隐藏+动画效果
        [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
    

    c) 补充
    既然两种都可以对状态栏进行管理,那么什么时候该用什么呢?
    如果状态栏的样式只设置一次,那就用UIApplication来进行管理;如果状态栏是否隐藏,样式不一样那就用控制器进行管理。UIApplication来进行管理有额外的好处,可以提供动画效果。

    • openURL:方法
      UIApplication有个功能十分强大的openURL:方法
    -(BOOL)openURL:(NSURL*)url;
    

    openURL:方法的部分功能有

    //打电话  
    UIApplication *app = [UIApplicationsharedApplication]; [app openURL:[NSURLURLWithString:@"tel://10086"]];
    //发短信  
    [app openURL:[NSURLURLWithString:@"sms://10086"]];
    //发邮件  
    [app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
    //打开一个网页资源
    [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
    打开其他app程序   openURL方法,可以打开其他APP。
    

    URL补充:
    URL:统一资源定位符,用来唯一的表示一个资源。
    URL格式:协议头://主机地址/资源路径
    网络资源:http/ftp等
    表示百度上一张图片的地址
    http://www.baidu.com/images/20140603/abc.png
    本地资源:
    file:///users/apple/desktop/abc.png(主机地址省略)

    UIApplication Delegate

    简单说明

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

    作用:当被打断的时候,通知代理进入到后台。

    UIapplication delegate

    每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理,NJAppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理。

    appdelegate

    代理方法

    #import "YYAppDelegate.h"
    
    @implementation YYAppDelegate
    
    // 当应用程序启动完毕的时候就会调用(系统自动调用)
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSLog(@"didFinishLaunchingWithOptions");
        return YES;
    }
    
    // 即将失去活动状态的时候调用(失去焦点, 不可交互)
    - (void)applicationWillResignActive:(UIApplication *)application
    {
        NSLog(@"ResignActive");
    }
    
    // 重新获取焦点(能够和用户交互)
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        NSLog(@"BecomeActive");
    }
    
    // 应用程序进入后台的时候调用
    // 一般在该方法中保存应用程序的数据, 以及状态
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        NSLog(@"Background");
    }
    
    // 应用程序即将进入前台的时候调用
    // 一般在该方法中恢复应用程序的数据,以及状态
    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        NSLog(@"Foreground");
    }
    
    // 应用程序即将被销毁的时候会调用该方法
    // 注意:如果应用程序处于挂起状态的时候无法调用该方法
    - (void)applicationWillTerminate:(UIApplication *)application
    {
    }
    
    // 应用程序接收到内存警告的时候就会调用
    // 一般在该方法中释放掉不需要的内存
    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
    {
        NSLog(@"MemoryWarning");
    }
    @end
    

    应用程序的五个状态

    1. Not running:应用还没有启动,或者应用正在运行但是途中被系统停止。
    2. Inactive:当前应用正在前台运行,但是并不接收事件(当前或许正在执行其它代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。
    3. Active:当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。
    4. Background:应用处在后台,并且还在执行代码。大多数将要进入Suspended状态的应用,会先短暂进入此状态。然而,对于请求需要额外的执行时间的应用,会在此状态保持更长一段时间。另外,如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not running状态进入Background状态,中途不会经过Inactive状态。比如没有界面的应用。注此处并不特指没有界面的应用,其实也可以是有界面的应用,只是如果要直接进入background状态的话,该应用界面不会被显示。
    5. Suspended:应用处在后台,并且已停止执行代码。系统自动的将应用移入此状态,且在此举之前不会对应用做任何通知。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处于Suspended状态的应用清除出内存以为正在前台运行的应用提供足够的内存。
    应用程序的5个状态

    相关文章

      网友评论

        本文标题:iOS-UIApplication简介

        本文链接:https://www.haomeiwen.com/subject/ghjqhttx.html