UI进阶之程序启动原理及UIApplication
UIApplication对象介绍: 1> 一个UIApplication代表是一个应用程序,而且是单例的。 ** 用来封装整个应用程序的一个对象, 比如当应用程序执行到某个时期要做什么, 生命周期等。 2> 获取UIApplication对象: [UIApplication sharedApplication];(单例的) /** 验证单例模式, 参考代码: - (void)viewDidLoad { [super viewDidLoad]; UIApplication *app1 = [UIApplication sharedApplication]; UIApplication *app2 = [UIApplication sharedApplication]; NSLog(@"%p----%p",app1, app2); } */ 3> 当一个iOS程序启动后,首先创建的第一个对象就是UIApplication对象。 4> 利用UIApplication可以做一些应用级别的操作。 * 应用级别操作: 1> QQ有消息的时候右上角的消息条数。 // 获取UIApplication对象。 UIApplication *app = [UIApplication sharedApplication]; // 设置右上角, 有10条消息 app.applicationIconBadgeNumber = 10; // 取消显示消息 app.applicationIconBadgeNumber = 0; /** 参考代码: // 当点击按钮时, 设置右上角消息 - (IBAction)click:(id)sender { // 获取UIApplication对象 UIApplication *app = [UIApplication sharedApplication]; // iOS 8 系统要求设置通知的时候必须经过用户许可。 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; [app registerUserNotificationSettings:settings]; app.applicationIconBadgeNumber = 10; // 有10条消息 // app.applicationIconBadgeNumber = app.applicationIconBadgeNumber > 0 ? 0 : 10; // 有10条消息 } */ 2> 联网操作时,状态栏上的等待图标指示器。waiting图标。 UIApplication *app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = YES; 3> 利用UIApplication打开某个资源: ** 系统会自动根据协议识别使用某个app打开。 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://[email protected]"]]; ** 使用openURL方法也可以打开其他应用,在不同应用之间互相调用对方。 ** 美图秀秀, 点击分享到"新浪微博", 打开"新浪微博"选择账号, 跳转回"美图秀秀", 开始分享 4> 通过UIApplication管理状态栏: ** 自从iOS7开始可以通过两种方式来控制状态栏 1> 控制器 * 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏) * 需要在控制器中实现如下方法: /** 参考代码: // 是否隐藏"状态栏" - (BOOL)prefersStatusBarHidden { return NO; } // 状态栏的样式 - (UIStatusBarStyle)preferredStatusBarStyle { // 白色 return UIStatusBarStyleLightContent; } */ 2> UIApplication * 通过UIApplication管理(一个应用程序的状态栏都由它统一管理) ** iOS7开始状态栏默认交给了控制器来管理,如果希望通过UIApplication来管理,步骤如下: 1> 在Info.plist文件中增加一个配置项 * View controller-based status bar appearance = NO, 2>然后编写如下代码: /** 参考代码: - (IBAction)click:(id)sender { UIApplication *app = [UIApplication sharedApplication]; // 设置状态栏是否隐藏 //app.statusBarHidden = YES; // 动画的方式 //[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; // 设置状态栏显示为白色 // app.statusBarStyle = UIStatusBarStyleLightContent; // 动画的方式 //[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; } */ 5. UIApplicationDelegate介绍。 ** 新建完项目以后的那个AppDelegate文件, 就是UIApplication的代理对象。 * 并且该代理对象已经被设置好了, 无需我们手动设置了。 * 在main函数中进行的设置 /** int main(int argc, char * argv[]) { @autoreleasepool { // 设置启动UIApplication对象, 和对应的代理对象AppDelegate。 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } */ ** App容易受到干扰。正在玩游戏,一个电话打过来了。 * 应用程序的生命周期事件(如程序启动和关闭) * 系统事件(如来电) * 内存警告 * … … ** 处理这些干扰事件,就要用到AppDelegate代理对象了。 ** 总结: AppDelegate的主要作用就是处理(监听)应用程序本身的各种事件: * 应用程序启动 * 应用程序进入后台 * 应用程序进入前台 * 内存警告 * 等等, 都是应用程序自身的一些事件 ** 要想成为UIApplication的代理对象, 必须遵守:UIApplicationDelegate协议。 ** 代理中的若干方法介绍: 1. - (BOOL)application: didFinishLaunchingWithOptions: // app第一次启动完毕后就会调用(当程序启动后会显示一张启动图片, 当这个图片显示完毕, 消失后, 就开始调用这个方法) 2. - (void)applicationDidEnterBackground:(UIApplication *)application // 当程序进入后台时, 调用该方法。(比如:按了Home键, 或者一个电话打过来了, 当前程序都会进入后台。) // 在这个方法中可以做一些保存当前程序数据, 暂停程序的操作。 3. - (void)applicationWillEnterForeground:(UIApplication *)application // 当程序再次进入前台的时候调用。 4. - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application // 当发生内存警告时触发该事件。 6. 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属性 程序正常退出时UIApplicationMain函数才返回 默认调用方式: UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 等价于 UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate"); ** 代理参数必须传递, 如果传nil, 则显示"黑屏"。 */ 7. iOS程序启动过程。参考PPT上的图片。 1> 打开程序。 2> 调用main函数。 3> 在main函数中调用: UIApplicationMain()函数。 * 在UIApplicationMain()函数中: 1. 创建UIApplication对象 2. 创建AppDelegate代理对象 3. 将AppDelegate代理对象设置给UIApplication对象。 4. 程序启动完毕: 触发application:didFinishLaunchingWithOptions事件。 5. 在UIApplicationMain()函数开启一个"死循环(事件循环)", 所以程序不会退出, 我们可以任意使用。在这个"死循环(事件循环)"中程序不断监听用户的各种事件, 依次处理(依靠"事件队列"实现)。 4> 程序退出。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。