UIApplication,AppDelegate,程序启动流程

UIApplication的简介

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

UIApplication的常用属性

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

@property(nonatomic) NSInteger applicationIconBadgeNumber;

特别提醒:applicationIconBadgeNumber

**在iOS8中要实现badge、alert和sound等都需要用户同意才能,因为这些都算做Notification“通知”,为了防止有些应用动不动给用户发送“通知”骚扰用户,所以在iOS8时,要“通知”必须要用户同意才行。
那么我们需要在app加载完毕时实现以下方法
**

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    float sysVersion=[[UIDevice currentDevice]systemVersion].floatValue;
    if (sysVersion>=8.0) {
        UIUserNotificationType type=UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;
        UIUserNotificationSettings *setting=[UIUserNotificationSettings settingsForTypes:type categories:nil];
        [[UIApplication sharedApplication]registerUserNotificationSettings:setting];
    }
    // Override point for customization after application launch.
    return YES;
}

2.设置联网指示器的可见性

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

3.管理状态栏

在iOS7以后默认情况下是UIViewController,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式
1.状态栏的样式

- (UIStatusBarStyle)preferredStatusBarStyle; 

2.状态栏的可见性

- (BOOL)prefersStatusBarHidden; 

利用UIApplication来管理状态栏
1.如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置
这里写图片描述
这样可以利用UIApplication属性管理状态栏

@property(nonatomic) UIStatusBarStyle statusBarStyle; // default is UIStatusBarStyleDefault
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated;

@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
//设置隐藏时的动画
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation 

openURL:

URL

1.URL:一个资源的唯一路径
2.URL的组成:协议头://主机域名/路径
网络资源URL http://
本地资源:file///路径

openURL:方法的部分功能有

打电话
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];

发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];

发邮件
[app openURL:[NSURL URLWithString:@"mailto://[email protected]"]];

打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://www.baidu.com"]];

AppDelegate

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
当程序被载入,UIApplication会检测到这一情况后,就会委托AppDelegate对象,调用该方法
*从某种意义上来讲,我们可以认为这个方法就是UI界面的“main”(即UI界面就从这个方法中开始搭建起来的)*/

(void)applicationWillResignActive:(UIApplication *)application;
当程序即将终止活动状态时,委托这个方法。(切换到后台、来电打断)

(void)applicationDidEnterBackground:(UIApplication *)application
当应用已经进入后台就会委托这个方法  释放大数据,保存进度,销毁定时器

(void)applicationWillEnterForeground:(UIApplication *)application
程序即将进入前台  重新载入图片等资源,重新创建对象,重启定时器等操作

(void)applicationDidBecomeActive:(UIApplication *)application
程序已经进入活动状态

(void)applicationWillTerminate:(UIApplication *)application
当程序即将崩溃时(内存不足),调用这个方法

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
内存紧张程序会被崩溃掉,在崩溃前如果有该方法就会调用,做一次内存的补救(比如释放不必要的大数据),如果补救失败,再崩溃

程序启动流程

UIApplication,AppDelegate,程序启动流程_第1张图片

UIApplication,AppDelegate,程序启动流程_第2张图片

UIApplicationMain

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

int UIApplicationMain(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函数才返回

UIWindow

1.创建方式

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    LROneViewController *one = [[LROneViewController alloc] init];
    one.view.backgroundColor = [UIColor redColor];
    self.window.rootViewController = one;
    //让window成为主窗口并且可见
    [self.window makeKeyAndVisible];
    return YES;
}

2.window的获得

//获取所有的window
[UIApplication sharedApplication].windows
//获取主window
[UIApplication sharedApplication].keyWindow
//获得某个UIView所在的UIWindow
view.window

你可能感兴趣的:(iOS,UI)