记录一下这个强大的对象
UIApplication简介
-
UIApplication
对象是应用程序的象征。 - 每一个应用程序都有自己的
UIApplication
对象,而且是单例。 - 一个iOS程序启动后创建的第一个对象就是
UIApplication
对象。 - 通过
UIApplication *app = [UIApplication sharedApplication];
可以获得这个单例对象。 - 利用
UIApplication
对象能进行一些应用级别的操作。
实际在程序入口main中就立刻创建了UIApplication对象,所以我们能够通过单例拿到
int main(int argc, char * argv[]) {
@autoreleasepool {
//这段代码就return了UIApplication对象
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplication能做些什么?
- 获取控制器的keyWindow
UIWindow *window = [UIApplication sharedApplication].keyWindow;
//值得注意的是,这时候获取到的window不一定是屏幕最前面的window
//因为像UIAlert和键盘等,都是在屏幕最前面的window,或者是modal出来的控制器。
//这时候需要获取最前面的窗口,不然就可能显示出问题。
获取顶层的keyWindow
UIWindow window = [[UIApplication sharedApplication].windows lastObject];
[window addSubview:aView];// 将要显示的view添加到窗口
- 设置应用程序图标右上角的红色提醒数字
UIApplication *app = [UIApplication sharedApplication];
app.applicationIconBadgeNumber = 30;
// 创建通知对象
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// 注册用户通知
[app registerUserNotificationSettings:setting];
- 设置联网指示器的可见性
UIApplication *app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible= YES;
- 功能十分强大的openURL:方法
UIApplication *app = [UIApplication sharedApplication];
// iOS10 新方法
// 可以异步执行open操作和主线程执行回调.
// ptions目前可传入参数Key在UIApplication头文件只有一个:
// UIApplicationOpenURLOptionUniversalLinksOnly 默认为no
// 设置yes时 只允许通过这个Link所代表的iOS应用跳转的方式打开这个链接 否则就会返回success为false
// 就是说只有安装了Link所对应的App的情况下才能打开这个Universal Link,而不是通过启动Safari方式打开这个Link的代表的网站.
// 打电话
[app openURL:[NSURL URLWithString:@"tel://110"] options:@{} completionHandler:nil];
// 发短信
[app openURL:[NSURL URLWithString:@"sms://1008"] options:@{} completionHandler:nil];
// 发邮件
[app openURL:[NSURL URLWithString:@"mailto://xxcc@fox.com"] options:@{} completionHandler:nil];
// 打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://www.baidu.com"] options:@{} completionHandler:nil];
// 当然也可以打开其他app
- 判断程序运行状态
//判断程序运行状态
/*
UIApplicationStateActive, //活跃
UIApplicationStateInactive, //应用程序失去焦点 程序还在运行但是不可交互
UIApplicationStateBackground //后台模式
*/
UIApplication *app = [UIApplication sharedApplication];
if(app.applicationState ==UIApplicationStateActive){
NSLog(@"程序在运行状态");
}
- 阻止屏幕变暗进入休眠状态
//阻止屏幕变暗,很耗电操作。
UIApplication *app = [UIApplication sharedApplication];
app.idleTimerDisabled =YES;
UIApplication Delegate
当app收到干扰,例如程序运行中来电等,就会产生一些系统事件,这时UIApplicaiton
会通知它的代理delegate
对象,让delegate
代理来处理这些系统事件。
delegate
可以处理的事件
- 应用程序的生命周期事件(如程序启动和关闭)
- 系统事件(如来电)
- 内存警告(用处较多)
每当我们创建项目时,程序中的AppDelegate文件就是UIAppliacation的代理,我们可以发现它已经遵守了UIApplicationDelegate。
// 应用程序启动完成的时候就会调用AppDelegate的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
// 当应用程序失去焦点的时候调用
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 当应用程序进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 当应用程序进入前台的时候调用 (接受到电话会进入后台)
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 当应用程序完全获取焦点的时候调用
// 只有当应用程序完全获取焦点的时候,才能够与用户交互
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s",__func__);
}
// 当应用程序关闭的时候
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"%s",__func__);
}
END.....
网友评论