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,如需转载请自行联系原作者