UIApplication简单从字面上了解就是应用程序,开发的时候有的时候会根据需要调用其中的方法,看起来不起眼,实际在iOS开发UIApplication提供了iOS程序运行期间的控制和协作工作。每一个应用程序在运行期必须有且仅有一个UIApplication(或则其子类)的一个实例,就是设计模式中常说的单例模式,通过sharedApplication获取单例对象,不需要另外的init一个UIApplication。
UIApllication概念
经常程序可能编译的时候没错,运行的时候报错,通常都是停留在main.m中,这是程序的入口点,也从这里创建了UIApplication单例实例。
1
2
3
4
5
|
int main( int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil , NSStringFromClass ([AppDelegate class ]));
}
}
|
UIIApplication一般主要用于处理用户事件,处理的时候会新建一个队列,将所有用户事件都放入队列,逐一处理,在处理的时候,它会发送当前事件 到一个合适的处理事件的目标控件。同时UIApplication实例还维护一个在本应用中打开的window列表(UIWindow实例),这样UIApplication可以获取应用中的任何一个UIView对象。UIApplication实例会被赋予一个代理对象,以处理应用程序的生命周期事件(比如程序启动和关闭),系统事件(比如电话、短信)等等。具体看下具体应用,
故事板中新建一个按钮,之后的画获取点击事件,加入以下两行代码:
1
2
3
|
UIApplication *application=[UIApplication sharedApplication];
application.applicationIconBadgeNumber=25;
|
在iOS8.0之前会看到App上面有红色的数字显示,前几个月微信头像整人事件,不少人被坑了,强迫自己几天没看微信,看到小红点就想点,控制台会提示以下信息:Attempting to badge the application icon but haven't received permission from the user to badge the application
具体解决办法很简单,就是获取以下机器的版本号,然后根据需要通知用户选择设置(个人觉得更人性化,手机上要是满屏的小红点,想想就。。);
1
2
3
4
5
6
7
8
9
|
float versionNumber=[[[UIDevice currentDevice] systemVersion] floatValue];
if (versionNumber >= 8.0) {
NSLog (@ "%@" ,[ NSString stringWithFormat:@ "当前的系统为%f" ,versionNumber]);
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories: nil ];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
|
UIApplication可以做一些其他的事情,比如其中的openURL就比较实用:
1
2
3
4
5
6
7
8
|
[application openURL:[ NSURL URLWithString:@ "tel://10010" ]];
[application openURL:[ NSURL URLWithString:@ "sms://10010" ]];
[application openURL:[ NSURL URLWithString:@ "mailto://10000@qq.com" ]];
[application openURL:[ NSURL URLWithString:@ "http://www.cnblogs.com/xiaofeixiang/" ]];
|
UIApplicationDelegate
UIApllicationDelegate协议中定义的方法有有一部分是和应用程序的状态是相关的,新建的项目默认的都有AppDelegate.h和AppDelegate.m文件,可以先参考以下默认生成的AppDelegate.m代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:( NSDictionary *)launchOptions {
NSLog (@ "application-程序完成加载" );
return YES ;
}
- ( void )applicationWillResignActive:(UIApplication *)application {
NSLog (@ "applicationWillResignActive-注销激活" );
}
- ( void )applicationDidEnterBackground:(UIApplication *)application {
NSLog (@ "applicationDidEnterBackground-进入后台" );
}
- ( void )applicationWillEnterForeground:(UIApplication *)application {
NSLog (@ "applicationWillEnterForeground-进入前台" );
}
- ( void )applicationDidBecomeActive:(UIApplication *)application {
NSLog (@ "applicationDidBecomeActive-成为激活状态" );
}
- ( void )applicationWillTerminate:(UIApplication *)application {
NSLog (@ "applicationWillTerminate-程序终止状态" );
}
@end
|
最开始main函数中其实是将AppDelegate实例化交给UIApplication去代理执行其中的方法,如果你喜欢这个AppDelegate文件,完成有必须要根据需要新建一个自己的类文件,只要声明UIApplicationDelegate即可。关于上面的状态我们可以先看一张苹果官网的图:

其中方法苹果默认有解释,不过大概写下个人的理解:
application:didFinishLaunchingWithOptions:—应用展示给用户之前完成最终的初始化工作
applicationWillResignActive:-从激活状态进入休眠状态,突然的电话,短信可以使当前程序进入后台,不可交互
applicationDidEnterBackground-应用程序进入后台,可以保存和传输数据
applicationWillEnterForeground-可以在这里恢复数据,即将进入前台,还不是激活状态
applicationDidBecomeActive-进入前台获取获取焦点,可以交互
applicationWillTerminate-应用程序销毁的时候调用,如果挂起不调用
写到这里可以具体看一下App的启动过程:
1.main函数
2.UIApplicationMain 创建UIApplication对象,创建UIApplication的delegate对象(监听应用程序状态)
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard,创建UIWindow(如果没有故事板,程序启动完毕时调用代理的application:didFinishLaunchingWithOptions:方法,在application:didFinishLaunchingWithOptions:中创建UIWindow ),创建和设置UIWindow的rootViewController, 显示窗口;
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4276169.html,如需转载请自行联系原作者