iOSOC语言特性iOS 开发

iOS UIApplication全家福及程序启动流程

2016-05-30  本文已影响317人  肥猫记

一、UIApplication

1. 简介:

2.常用属性和方法:

// 应用程序代理
@property(nullable, nonatomic,assign) id<UIApplicationDelegate> delegate;

// 应用程序的主窗口
@property(nullable, nonatomic,readonly) UIWindow *keyWindow;

// 应用程序的窗口集合
@property(nonatomic,readonly) NSArray<__kindof UIWindow *>  *windows;

// 设置网络状态默认为NO,YES可以在系统状态栏显示一个转动的菊花
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible __TVOS_PROHIBITED; 

// 设置屏幕是否为常亮默认为NO,YES为常亮
@property(nonatomic,getter=isIdleTimerDisabled)       BOOL idleTimerDisabled;

// 用来显示或者隐藏系统状态栏默认为NO,设置YES为隐藏系统状态栏
@property(readonly, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden __TVOS_PROHIBITED;

// 设置系统状态栏的样式默认为UIStatusBarStyleDefault
/*UIStatusBarStyle常用枚举值
UIStatusBarStyleDefault //黑暗模式                
UIStatusBarStyleLightContent //灯光模式       
*/
@property(readonly, nonatomic) UIStatusBarStyle statusBarStyle __TVOS_PROHIBITED; 

// 可以设置应用程序图标上面的数字
@property(nonatomic) NSInteger applicationIconBadgeNumber __TVOS_PROHIBITED; 
// 在iOS8.0以后 要使用UIApplication给应用程序设置图标数字时,要注册一个系统通知UIUserNotificationTypeBadge 就可以设置应用程序图标上面的数字
/*  代码示例:
    if ([[[UIDevice currentDevice] systemVersion] floatValue] > 8.0) {
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    }
    [UIApplication sharedApplication].applicationIconBadgeNumber = 10;
*/

// 类方法,用来获取UIApplication对象
+ (UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead.");

// 可以打开一个指定的NSURL所指的资源
- (BOOL)openURL:(NSURL*)url NS_EXTENSION_UNAVAILABLE_IOS("");

3. 状态栏的管理

// 示范代码:
// 隐藏系统状态栏
[UIApplication sharedApplication].statusBarHidden = YES;
// 设置系统状态栏样式
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

// 隐藏系统状态栏带动画
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
// 设置系统状态栏样式带动画
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

4. openURL方法的应用

/*
NSURL统一资源定位符  格式 > 协议://路径
*/
// 创建UIApplication对象
UIApplication  *app = [UIApplication sharedApplication];

// 打电话 tel为打电话协议
[app openURL:[NSURL URLWithString:@"tel://10086"]];

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

// 打开网址 http为上网协议
[app openURL:[NSURL URLWithString:@"http://www.ithemima.com"]];

// 发送邮件 mailto为发送邮件协议
[app openURL:[NSURL URLWithString:@"mailto://zhangsan@itcast.cn"]];

二、应用程序的状态介绍

应用程序状态.png

三、UIApplicationDelegate

1.简介:

UIApplicationDelegate定义的方法主要工作之一就是跟踪应用程序的状态变化,当应用程序发生重大的运行时事件时如:应用启动完毕、低内存警告和应用程序终止,进入前台、后台、可见等的时候会在适当的时机通知代理做出响应

2.代理方法及对应的执行时机

// 应用程序启动完毕
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"应用程序启动完毕");
    return YES;
}
// 应用程序变为不活跃状态
- (void)applicationWillResignActive:(UIApplication *)application {

    NSLog(@"应用程序变为不活跃状态");
}
// 应用程序进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
   /**
     1.停止timers并终止其他周期性的任务。
     2.停止任何正在运行的元数据查询。
     3.不要初始化任何新的任务。
     4.暂停电影播放(在AirPlay上播放的除外)。
     5.游戏进入暂停状态。
     6.暂停所有执行非关键代码的调度队列和操作队列(即使处于Inactive状态,依然可以继续处理网络请求和其他耗时的后台任务)。
     */
    NSLog(@"应用程序进入后台");
}
// 应用程序进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"应用程序进入前台");
}
// 应用程序变为活跃状态
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // 恢复在- (void)applicationWillResignActive:(UIApplication *)application方法中做的所有任务
    // 但游戏的恢复应该让用户自己决定。
    NSLog(@"应用程序变为活跃状态");
}
// 应用程序即将终止
- (void)applicationWillTerminate:(UIApplication *)application {
    NSLog(@"应用程序即将终止");
}
// 应用程序收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
    NSLog(@"应用程序收到内存警告");
}

四、UIApplicationMain

int UIApplicationMain ( int argc, char * _Nonnull argv[], NSString *principalClassName, NSString *delegateClassName );
   /*  
   1.返回值为一个int类型  
   2.第一个参数:对应main函数的第一个参数:参数个数  
   3.第二个参数:对应main函数的第二个参数:参数列表  
   4.第三个参数:principalClassName    UIApplication类或子类的类名字,如果为nil.默认为UIApplication  
   5.第四个参数:delegateClassName  应用程序代理类的名字
    */  
  • UIApplicationMain函数会根据principalClassName创建 UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

五、应用程序的启动

iOS程序启动过程.png

程序启动的完整过程:

  1. 先执行main函数,main内部会调用UIApplicationMain函数,该函数的声明如下:
 int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)。
 //argc、argv:标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可
 //principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
//delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议。
  1. 在UIApplicationMain函数里面做了如下几件事情:
    (1). 根据传入的第三个参数创建UIApplication对象或它的子类对象。如果该参数为nil,直接使用该UIApplication来创建。(该参数只能传人UIApplication或者是它的子类)
    (2). 根据传入的第四个参数创建AppDelegate对象,并将该对象赋值给第1步创建的 UIApplication对象的delegate属性。
    (3). 开启一个事件循环,循环监控应用程序发生的事件。每监听到对应的系统事件时,就会通知AppDelegate。

3、接着加载控制器view分两种情况

上一篇下一篇

猜你喜欢

热点阅读