11-08iOS中UIApplication
1 //UIApplication是第一个创建的对象,是应用程序的象征,是一个单例
2 UIApplication *app = [UIApplication sharedApplication];
3 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
4 [app registerUserNotificationSettings:settings];
5 app.applicationIconBadgeNumber = 9;
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
* 显示窗口