一.UIApplication, UIApplicationDelegate,UIApplicationMain的分析
* UIApplication的核心作用是提供iOS程序运行期间的控制和协调工作。
* 每一个应用程序都有自己的UIApplication对象,而且是一个单例对象。
* 通过UIApplication对象可以进行一些应用级别的操作。
* 演示UIApplication的使用
>获取UIApplication对象UIApplication *app = [UIApplication sharedApplication];
>设置应用图标的红色数字UIApplication的applicationIconBadgeNumber属性。
iOS8更新之后,在设置applicationIconBadgeNumber时提示错误,原因是iOS8之后设置应用
程序的applicationIconBadgeNumber需要用户授权
授权方式如下:
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
>阻止屏幕变暗,慎重使用,缺省为NO 2.0 UIApplication的idleTimerDisabled属性 设置为YES
慎重使用本功能,因为非常耗电。
>联网指示器 UIApplication的networkActivityIndicatorVisible属性。
>利用UIApplication管理状态栏(iOS7以前状态栏是由UIApplication管理,iOS7以后交给控制器管理)。
1)、在ios7以后,状态栏默认是交给控制器去管理的,控制器实现下面两个方法就可以控制状态栏的显示、隐藏以及样式
/**
* 隐藏状态栏
*/
- (BOOL)prefersStatusBarHidden {
return YES;
}
/**
* 改变状态栏样式
*/
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
2)、在ios7以后,状态栏要想交给UIApplication管理,要在Info.plist中设置View controller-based status bar appearance 为 NO
UIApplication *app = [UIApplication sharedApplication];
/****** 无动画 ***********/
app.statusBarHidden = YES;
app.statusBarStyle = UIStatusBarStyleLightContent;
/****** 有动画 ***********/
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
3)、UIApplication管理状态栏的好处:
*、可以设置动画
*、更灵活,可以随时随地的设置状态栏样式。
> UIApplication的openUrl:方法。(打电话,发信息,发邮件(模拟器执行前面三种操作)、打开网页资源,
打开其他应用(分享)等等)
* URL: 一个资源的唯一路径
* URL的组成: 协议头://主机域名/路径
使用 application打开网络资源的好处:系统自动识别用什么软件打开该资源。
* UIApplicationDelegate对象介绍
>UIApplicationDelegate对象的方法主要工作之一就是跟踪应用程序的状态变化,如进入前台、后台、可见等
// 应用程序启动完毕
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// NSLog(@"应用程序加载完毕");
return YES;
}
// 应用即将变为不活跃状态 [失去焦点]
- (void)applicationWillResignActive:(UIApplication *)application {
//NSLog(@"即将变为不活跃状态 [失去焦点]");
一般在这个方法执行如下操作:
* 暂停正在执行的任务
* 禁止计时器
* 若为游戏应暂停游戏
}
// 应用程序进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
//NSLog(@"应用程序进入后台");
一般在这个方法执行如下操作:
* 保存当前应用信息和应用状态
* 保存用户数据(写到沙盒)
* 若为游戏,保存游戏积分
* 废除定时器
}
// 应用即将进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
// NSLog(@"即将进入前台");
}
// 应用变为活跃状态
- (void)applicationDidBecomeActive:(UIApplication *)application {
//NSLog(@"应用变为活跃状态[获取焦点]");
}
// 应用即将销毁
- (void)applicationWillTerminate:(UIApplication *)application {
//NSLog(@"应用即将销毁");
}
// 应用接收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
// NSLog(@"应用接收到内存警告");
}
* UIApplicationMain函数官方描述:
1> Return Value
Even though an integer return type is specified, this function never returns. When users exits an iOS application by pressing the Home button, the application moves to the background.
返回值
虽然这个函数指定的返回值为整形,但这个函数永远不会返回。当用户按home键退出iOS应用,应用就会进入到后台。
2> Discussion
This function instantiates the application object from the principal class and instantiates the delegate (if any) from the given class and sets the delegate for the application. It also sets up the main event loop, including the application’s run loop, and begins processing events. If the application’s Info.plist file specifies a main nib file to be loaded, by including the NSMainNibFile key and a valid nib file name for the value, this function loads that nib file.
从官方对该函数的描述可以知道,该函数主要做了以下几件事:
函数原型:
UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)
1) 根据principalClassName指定的类名创建 application 对象。如果principalClassName为 nil,默认创建UIApplication的对象。
2) 根据delegateClassName指定的类名创建对象,并将该对象设置为应用程序代理。
3) 开启事件循环,包括应用程序的循环运行,并开始处理事件。
4) 如果应用程序的Info.plist文件指定了最主要stroyboard文件,这个函数加载该stroyboard文件。