11-08iOS中UIApplication

    (一)UIApplication是一个单例,是应用程序的象征。通过[UIApplication sharedApplication]可以获取到这个单例,一般shared...或者default...都是单例。一个应用程序启动第一个创建的对象就是UIApplication。
     (1)设置提示数字:
1     //UIApplication是第一个创建的对象,是应用程序的象征,是一个单例
2     UIApplication *app = [UIApplication sharedApplication];
3     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
4     [app registerUserNotificationSettings:settings];
5     app.applicationIconBadgeNumber = 9;
  此时就会询问是否允许通知,选择同意就可以显示数字了。
  
  然后在设置中就会看到UIApplication的设置
 
  这些都是一次性设置,当用户选择一次后,下次就按照选择默认来了。假如关闭了,就再也打不开通知了,此时就需要旁敲侧击的告诉用户你需要手动打开才能收到我们的通知。
  (2)设置网络指示器的可见性:
app.networkActivityIndicatorVisible = true;

  这样就会看到一个小菊花在旋转了。

  (3)设置状态栏样式:可以通过控制器来管理也可以通过UIApplication管理

    3.1控制器管理: 

// 设置是否显示状态栏
-(BOOL)prefersStatusBarHidden {
    
    return false;
}
// 设置状态栏的颜色(黑色/白色)
-(UIStatusBarStyle)preferredStatusBarStyle {
    
    return UIStatusBarStyleLightContent;
}

    3.2UIApplication管理:需要在plist中先拖拽到最后一排,设置权限为YES,这样控制器就没有用了。然后直接调用app的状态栏属性/调用set方法就可以了。

    // 权限交给UIApplication后
    app.statusBarHidden = true;

  至于动画效果以前可以淡入淡出或者划出去,现在方法都废弃了。

 

  (4)OpenURL:可以打电话,发短信,发邮件,打开网页资源,打开其他app。根据不同的协议头,跳转不同的操作。

 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]]; // 打开百度网页

  @“tel://10086”  @"sms://10086" @"mailto://18504725177@163.com" 分别是打电话,发短信,发邮件给各自的位置。

(二)UIApplicationDelegate:所有app都有一个缺点,当被打扰(电话,短信)就会导致app直接进入后台或者终止。在产生干扰时,UIApplication会通知delegate对象,让delegate代理来完成一些事情。

// 程序第一次加载完毕
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

// 程序已经进入后台
// 保存数据
- (void)applicationDidEnterBackground:(UIApplication*)application

// 程序将要进入前台
// 恢复数据
- (void)applicationWillEnterForeground:(UIApplication*)application

// 程序将要失去焦点 - 不能交互
- (void)applicationWillResignActive:(UIApplication*)application

// 程序已经获取焦点 - 可以交互
- (void)applicationDidBecomeActive:(UIApplication*)application

// 程序挂了
// 注意:1.用户主动关闭 2.系统因为内存不够关闭了程序
- (void)applicationWillTerminate:(UIApplication*)application

// 程序接收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

  例如玩游戏进入后台时候保存,前台时候继续。

(三)程序启动过程:整体是一个死循环,无休止的监听任何时间,通过运行循环(定时源和输入源)

(四)UIWindow:是一个特殊的UIView,一般一个app就一个UIWindow。ios启动完毕,创建的第一个视图控件就是UIWindow(创建的第一个对象是UIApplication),之后创建控制器view,再把view添加到window上。一个ios之所以能够显示在屏幕上,就是因为有UIWindow。没有UIWindow是看不到界面的。 默认什么都没有的话,屏幕就是黑色了。例如删除了SB,一切都删除,纯代码写的话,什么都不写就是黑色的。

  UIWindow标准纯代码创建方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor clearColor];
    self.window.rootViewController = [[ViewController alloc] init];
    [self.window makeKeyAndVisible];
    
    return YES;
}

  警告:如上是添加rootViewController来实现添加子控制器。其实还有一个方法是self.window addSubView添加控制器的view,但是这个方法是不能监听点击事件的。所以上面的添加rootViewController的方法最直观。还有一点不同之处在于,采用rootView添加的控件,在旋转的时候是跟着模拟器走的,例如新闻,竖着横着新闻条目跟着走。而添加subView的方法,新闻就给歪着脑袋才能看了。。

  一个APP也可以有多个window,但是只能由一个keyWindow。获取全部window或者获取当前主window用的方法都是通过[UIApplication sharedApplication]单例来实现的。

  通过view.windows属性就能获取到当前view所在的window。

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window1 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    self.window.backgroundColor = [UIColor greenColor];
    self.window1.backgroundColor = [UIColor yellowColor];
    
    self.window.rootViewController = [ViewController new];
     self.window1.rootViewController = [ViewController new];
    
    [self.window makeKeyAndVisible];
    [self.window1 makeKeyAndVisible];
    
    // 获取key 发现是window1
    UIWindow *win = [[UIApplication sharedApplication] keyWindow];
    // 获取全部window
    NSArray *array = [[UIApplication sharedApplication] windows];

 

  (五)四大对象关系:

  程序启动,创建UIApplication对象,代理属性交给UIApplicationDelegate,在代理中创建了UIWindow(默认强引用),在UIWindow的rootViewDController中引用root控制器,

再在控制器中设置所需要的view。

  

程序启动的完整过程
1.main函数

2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
* 绑定

3.delegate对象开始处理(监听)系统事件---> 事件循环

4.加载info.plist ---> 看有没有sb

5.(有storyboard)
* 加载最主要的storyboard
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口

5.(没有storyboard)
* 创建和设置UIWindow的rootViewController
* 显示窗口

posted @ 2015-11-08 16:36  珍妮是谁  阅读(121)  评论(0编辑  收藏  举报