iOS开发UI篇 -- 0407UIApplication、UIWindow以及程序启动过程

1、什么是UIApplication

UIApplication 对象是应用程序的象征
每一个应用都有自己的 UIApplication 对象,而且是单例的
通过 [ UIApplication sharedApplication ] 可以获得这个单例对象
一个 iOS 程序启动后创建的第一个对象就是 UIApplication 对象
利用 UIApplication 对象,能进行一些应用级别的操作

2、UIApplication的常用属性

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

@property(nonatomic)NSIntegerapplicationIconBadgeNumber;


设置联网指示器的可见性

@property(nonatomic,getter=isNetworkActivityIndicatorVisible)BOOL networkActivityIndicatorVisible;

 

3、iOS7中的状态栏

iOS7 开始,系统提供了 2 种管理状态栏的方式
Ø 通过 UIViewController 管理(每一个 UIViewController 都可以拥有自己不同的状态栏)
Ø 通过 UIApplication 管理(一个应用程序的状态栏都由它统一管理)
在iOS7中,默认情况下,状态栏都是由 UIViewController 管理 UIViewController 实现下列方法就可以轻松管理状态栏的可见性和样式
Ø 状态栏的样式

-(UIStatusBarStyle)preferredStatusBarStyle;

Ø 状态栏的可见性

- (BOOL)prefersStatusBarHidden;

4、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 程序

5、上述代码

- (IBAction)changeAppNum {
    UIApplication *app = [UIApplication sharedApplication];
//    [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
    
//    app.statusBarHidden = YES;
//    app.statusBarStyle = UIStatusBarStyleLightContent;
    [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
    
    // 0代表清除图标右上角的数字
//    app.applicationIconBadgeNumber = 0;
    
    // 设置显示联网状态
//    app.networkActivityIndicatorVisible = YES;
    
    // URL : 一个资源的唯一路径
    
    // URL的组成 == 协议头://主机域名/路径
    
    // 网络资源URL的组成 == http://www.baidu.com/1.png
    
    // 本地文件资源URL的组成 == file:///Users/apple/Desktop/1.png
    
//    [app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];
    
    // 打电话
//    [app openURL:[NSURL URLWithString:@"tel://10086"]];
}

6、UIApplicationdelegate

所有的移动操作系统都有个致命的缺点: app 很容易受到打扰。比如一个来电 或者锁屏会 导致 app 进入后台甚至被终止
还有很多其它类 似的情况会导致 app 受到干扰,在 app 受到干扰时,会产生一些系统事件 ,这时 UIApplication 会通知它的 delegate 对象,让 delegate 代理来处理这些系统事件
delegate 可处理的事件包括
Ø 应用程序 的生命周期事件 ( 如程序启动和关闭 )
Ø 系统 事件 ( 如来电 )
Ø 内存警告

7、UIApplicationDelegate中的方法,我们可以在这些代理方法中做一些必要的操作

//
//  MJAppDelegate.m
//  06-UIApplication
//
//  Created by apple on 14-4-7.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "MJAppDelegate.h"

@implementation MJAppDelegate

/**
 *  app启动完毕后就会调用
 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"%@", self.window);
    
    NSLog(@"didFinishLaunchingWithOptions");
    
    // 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.
}

/**
 *  app进入后台的时候调用
 *
 *  一般在这里保存应用的数据(游戏数据,比如暂停游戏)
 */
- (void)applicationDidEnterBackground:(UIApplication *)application
{
     NSLog(@"applicationDidEnterBackground");
    // 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.
}
/*
*app进入前台调用
*/
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSLog(@"applicationWillEnterForeground");
    // 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)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    NSLog(@"applicationDidReceiveMemoryWarning");
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end


 
 

8、iOS程序的启动过程

9、UIApplicationMain

main函数中执行了一个UIApplicationMain这个函数

intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

argc、argv:直接传递给UIApplicationMain进行相关处理即可 

principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

 delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议

UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)

程序正常退出时UIApplicationMain函数才返回

#import <UIKit/UIKit.h>

#import "YYAppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        // return UIApplicationMain(argc, argv, nil, NSStringFromClass([YYAppDelegate class]));
        // return UIApplicationMain(argc, argv, @"UIApplication", NSStringFromClass([YYAppDelegate class]));
        /*
         argc: 系统或者用户传入的参数个数
         argv: 系统或者用户传入的实际参数
         1.根据传入的第三个参数创建UIApplication对象
         2.根据传入的第四个产生创建UIApplication对象的代理
         3.设置刚刚创建出来的代理对象为UIApplication的代理
         4.开启一个事件循环
         */
         return UIApplicationMain(argc, argv, @"UIApplication", @"YYAppDelegate");
    }
}

系统入口的代码和参数说明:

argc:系统或者用户传入的参数
argv:系统或用户传入的实际参数 
1.根据传入的第三个参数,创建UIApplication对象
2.根据传入的第四个产生创建UIApplication对象的代理
3.设置刚刚创建出来的代理对象为UIApplication的代理
4.开启一个事件循环(可以理解为里面是一个死循环)这个时间循环是一个队列(先进先出)先添加进去的先处理


10、UIWindow介绍

UIWindow 是一种特殊的 UIView ,通常在一个 app 中只 会有一个 UIWindow
iOS 程序启动完毕后,创建的第一个视图控件就是 UIWindow ,接着创建控制器的 view ,最后将控制器的 view 添加到 UIWindow 上,于是控制器的 view 就显示在屏幕上了
一个 iOS 程序之所以能显示到屏幕上,完全是因为它有 UIWindow
也就说,没有 UIWindow ,就看不见任何 UI 界面

[ UIApplication sharedApplication ]. windows

在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView

(平时输入文字弹出的键盘就处在一个新的UIWindow)

[ UIApplication sharedApplication ]. keyWindow

用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindowkeyWindow如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow

view. window

获得某个UIView所在的UIWindow


/**
 *  程序启动完毕就会调用一次
 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 1.创建window
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // 2.设置window的背景色
    self.window.backgroundColor = [UIColor whiteColor];
    
    MjOneViewController *one = [[MjOneViewController alloc] init];
//    [self.window addSubview:one.view];
    self.window.rootViewController = one;

    // 3.显示window
    [self.window makeKeyAndVisible];
    return YES;
}


11、程序启动完整步骤

程序启动的完整过程

1.main函数

2.UIApplicationMain

* 创建UIApplication对象

* 创建UIApplication的delegate对象

 

3.delegate对象开始处理(监听)系统事件(没有storyboard)

* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口

 

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

* 创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口


12、四大对象关系图






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值