app的启动顺序对于我们理解项目有着十分重要的作用,下面这张图可以从大体上看出程序的启动过程:

ios 启动其他应用_ios


由上图可以看出,当我们打开程序时,首先会执行main函数(这是任何程序的入口),接着执行UIApplicationMain函数,在这个函数中系统会默认做两件事情:创建UIApplication对象和给UIApplication设置代理对象,紧接着会开启事件循环,UIApplicationDelegate对象会监听系统事件,当监听到对应的事件时代理对象就会调用对应的方法。

在上面的程序启动原理中涉及到几个对象,我们就详细说说其作用:

1.UIApplication对象

UIApplication对象是代表着本应用程序,是单例对象。当程序启动后第一个新建的对象就是UIApplication对象,利用该对象能够做一些应用级别的操作。

* 设置应用右上角的信息条数

* 联网操作时,状态栏上的等待图标指示器(旋转小菊花)

* 通过URL打开一些资源

* 管理状态栏

这些功能的简要一些属性和方法:

@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; // 小菊花
@property(nonatomic) NSInteger applicationIconBadgeNumber;  // 右上角的信息条数,iOS8之后系统要求设置通知的时候必须经过用户认可
@property(readonly, nonatomic) UIStatusBarStyle statusBarStyle; //状态栏的模式 
@property(readonly, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden; // 是否隐藏状态栏
- (BOOL)openURL:(NSURL*)url ; // 打开一些资源

设置右上角信息条数的代码
    UIApplication *app =[UIApplication sharedApplication];
    // 1.设置应用右上角的信息提示条数
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
        [app registerUserNotificationSettings:settings];
        app.applicationIconBadgeNumber = 90;
}

简单实现几个打开资源的方法:
 UIApplication *app = [UIApplication sharedApplication];
** 打开一个网页:
[app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];                   
** 打电话
[app openURL:[NSURL URLWithString:@"tel://10086"]];                         
** 发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];          
** 发邮件
[app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];
 ** 使用openURL方法也可以打开其他应用,在不同应用之间互相调用对方。

2.UIApplication的代理对象
当app都到干扰时,会产生一系列系统事件,这时UIApplication便会通知它的代理对象,让它的代理对象处理这些事情:
**应用程序的生命周期事件(如程序启动和关闭)
**系统事件(如来电)
**内存警告
3. UIApplicationMain函数介绍。
/**
方法名:
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

参数介绍:
    argc:使用main函数的argc即可
    argv:使用main函数的argv即可
    principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类),如果为nil,则用UIApplication类作为默认值
    delegateClassName:指定应用程序的代理类,UIApplicationDelegate协议中定义的方法,在该类中实现.

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

4.程序的启动全过程
一、 有storyboard文件
1. 调用main函数
2. 调用UIApplicationMain函数
3. 创建UIApplication对象 、 AppDelegate对象
4. 设置UIApplicatio对象的代理是AppDelegate对象。
5. AppDelegate对象开始监听”系统事件(应用程序的事件)”,进入”事件循环”
6. 程序启动完毕后调用 application: didFinishLaunchingWithOptions:方法。
7. 在application: didFinishLaunchingWithOptions:方法中自动创建
* UIWindow对象。
* 根据Info.plist文件配置(Main Interface),找到需要加载的storyboard文件(Main.storyboard)
* 找到Main.storyboard中的Is Initial View Controller 对应的控制器类, 创建该控制器对象。
* 根据storyboard中的配置, 创建控制器对应的view。
* 设置UIWindow的根控制器(rootViewController)为刚才创建的控制器。
* 显示UIWindow([self.window makeKeyAndVisible])。
二、 没有storyboard文件
1. 调用main函数。
2. 调用UIApplicationMain函数。
3. 创建UIApplication对象 、 AppDelegate对象
4. 设置UIApplicatio对象的代理是AppDelegate对象。
5. AppDelegate对象开始监听”系统事件(应用程序的事件)”,进入”事件循环”。
6. 程序启动完毕后调用 application: didFinishLaunchingWithOptions:方法。
7. 在application: didFinishLaunchingWithOptions:方法中手动创建:
* UIWindow
* 控制器
* 设置UIWindow的根控制器是刚才创建的控制器
* 显示UIWindow

5.四大对象关系图

ios 启动其他应用_ios 启动其他应用_02