什么是UIApplication?
UIApplication对象是应用程序的象征
一个应用程序只有一个UIApplication对象,而且是单例的。
通过[UIApplication sharedApplication]可以获得这个单例对象
一个iOS程序启动后创建的第一个对象就是UIApplication对象
利用UIApplication对象,能进行一些应用级别的操作
UIApplication单例
//设置应用程序图标右上角的红色提醒数字
@property(nonatomic)NSInteger applicationIconBadgeNumber;
//设置联网的状态
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
实现一个类似于UIApplication的类,模仿系统单例
//Person.h
@interface Person : NSObject
+(void)sharedPerson;
@end
//Person.m
@implementation Person
static Person *_instance;
+(void)sharedPerson{
return _instance;
}
//当类被加载到内存中,就会调用
+(void)load{
NSLog(@"%@",__func__);
_instance = [[Person alloc] init];
}
+(instancetype)alloc{
if(_instance){
//程序崩溃
NSException *exc = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person" userInfo:nil ];
//抛出异常
[exc raise];
}
return [super alloc];
}
@end
UIApplication功能
//设置提醒图标
UIApplication *APP = [UIApplication sharedApplication];
//注册用户通知
UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForType:UIUserNotificationTypeBadge categories:nil];
[APP.registerUserNotificationSettings:notice];
APP.applicationIconBadgeNumber = 10;
//设置联网状态
APP.networkActivityIndicatorVisible = YES;
//设置状态栏
/*
从ios7开始,系统提供了两种管理状态栏的方式
通过UIViewController管理,(每一个UIViewController都可以拥有自己不同的状态栏)
通过UIApplication管理,(一个应用程序的状态栏都由它同一管理)
*/
//方式1:控制器管理方式
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
-(BOOL)prefersSttusBarHidden{
return NO;
}
//方式2:通过UIApplication管理
info.plist文件中将控制器管理状态栏设置为NO
再设置
APP.statusBarHidden = YES;
APP.statusBarStyle = UIStatusBarStyleLightContent;
//打电话
[APP openURL:[NSURL URLWithString:@"tel://10086"]];
//发短信
[APP openURL:[NSURL URLWithString:@"sms://10086"]];
//发邮件
[APP openURL:[NSURL URLWithString:@"mailto://10086@123.com"]];
//打开网页
[APP openURL:[NSURL URLWithString:@"http://www.520it.com"]];
UIApplication代理
1.所有的移动操作系统都有个致命的缺点,app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止
2.还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
3.每个项目新建完成后,都有个“AppDelegate”字眼的类,它就是UIApplication的代理
AppDelegate文件
///> app 启动完成 程序准备开始运行
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
///> app 进入活跃状态,获取焦点(能否与用户进行交互)
- (void)applicationDidBecomeActive:(UIApplication *)application
///> app 进入非活跃状态,失去焦点 如:打开状态栏 来电话 等等 只会调用此方法。不会调用进入后台
- (void)applicationWillResignActive:(UIApplication *)application
///> app 进入后台 会调用 (app 进入非活跃状态)的方法
- (void)applicationDidEnterBackground:(UIApplication *)application
///> app 进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application
///> app 即将退出 杀死程序
- (void)applicationWillTerminate:(UIApplication *)application
//APP收到内存警告,在这个方法中可以做一些清除缓存的操作
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
给Controller添加通知 所以我们只需要添加前面两个就可以了
// app进入活跃状态
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
// app进入非活跃状态
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];
// app进入前台
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
// app进入后台
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground) name: UIApplicationDidEnterBackgroundNotification object:nil];
程序启动调用顺序:
1.app 启动完成 程序准备开始运行
2.app 进入活跃状态
打开状态栏调用顺序
1.app 进入非活跃状态
关闭状态栏调用顺序
1.app 进入活跃状态 「 有延迟 大约1s 」
进入后台调用顺序 --> 点击Home键
1.app 进入非活跃状态
2.app 进入后台
进入前台调用顺序
1.app 进入前台
2.app 进入活跃状态
双击Home键盘
1.app 进入非活跃状态
杀死app
1.app 进入后台
2.app 即将推出
应用程序启动原理
1.程序启动,首先执行main函数
2.执行UIApplicationMain函数,第三个参数:设置应用程序对象的名称UIApplication或者是它的子类,如果是nil,默认是UIApplication。第四个参数:NSStringFromClass:AppDelegate将类名转化为字符串
3.开启了一个事件循环(主运行循环,死循环,保证应用程序不退出)
4.加载应用程序info.plist文件(判断info.plist文件当中有没有mainStoryboard参数,如果有,就去加载main.storyboard)
5.应用程序启动完毕,(通知代理应用程序启动完毕)didFinishLaunchingWithOptions