什么是UIApplication
•
UIApplication
对象是应用程序的象征
•
•
每一个应用都有自己的
UIApplication
对象,而且是单例的
•
•
通过
[
UIApplication
sharedApplication
]
可以获得这个单例对象
•
•
一个
iOS
程序启动后创建的第一个对象就是
UIApplication
对象
•
•
利用
UIApplication
对象,能进行一些应用级别的操作
UIApplication *app = [UIApplication sharedApplication];
UIApplication *app1 = [UIApplication sharedApplication];
UIApplication *app2 = [[UIApplication alloc] init];
NSLog(@"%p %p %p", app, app1, app2);
这里错误显示不能调用init方法,而且写着UIApplication是单例
UIApplication的常用属性
•
设置应用程序图标右上角的红色提醒数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
<span style="font-size:18px;">IOS7:
UIApplication *app = [UIApplication sharedApplication];
// 应用程序右上角数字
app.applicationIconBadgeNumber = 10;
上面的代码可以搞定
IOS8:
iOS8中设置application badge value 会抛错:Attempting to badge the application icon but haven't received permission from the user to badge the
原因是因为在ios8中,设置应用的application badge value需要得到用户的许可。使用如下方法咨询用户是否许可应用设置application badge value
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
在这之前要判断系统是否为iOS8的系统,否则8之前的系统会报错。
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
UIApplication *app = [UIApplication sharedApplication];
// 应用程序右上角数字
app.applicationIconBadgeNumber = 10; </span><span style="font-size: 28pt;">
</span>
•
设置联网指示器的可见性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
iOS7中的状态栏
•
从
iOS7
开始,系统提供了
2
种管理状态栏的方式
Ø
通过
UIViewController
管理(每一个
UIViewController
都可以拥有自己不同的状态栏)
Ø
通过
UIApplication
管理(一个应用程序的状态栏都由它统一管理)
•
在iOS7中,默认情况下,状态栏都是由
UIViewController
管理
的
,
UIViewController
实现下列方法就可以轻松管理状态栏的可见性和样式
Ø
状态栏的样式
-(UIStatusBarStyle)preferredStatusBarStyle;
Ø
状态栏的可见性
- (BOOL)prefersStatusBarHidden;
利用UIApplication来管理状态栏
•
如果想利用
UIApplication
来管理状态栏,首先得修改
Info.plist
的设置
openURL:
•
UIApplication
有个功能十分强大的
openURL
:
方法
-(BOOL)openURL:(NSURL*)url;
-
•
openURL:
方法的部分功能有
Ø
打电话
UIApplication *app = [UIApplicationsharedApplication];
[app openURL:[NSURLURLWithString:@"tel://10086"]];
Ø
发短信
[app openURL:[NSURLURLWithString:@"sms://10086"]];
Ø
发邮件
[app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
Ø
打开一个网页资源
[app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
Ø
打开其他
app
程序
UIApplication和delegate
•
所有的移动操作系统都有个致命的缺点:
app
很容易受到打扰。比如一个来电
或者锁屏会
导致
app
进入后台甚至被终止
•
•
还有很多其它类
似的情况会导致
app
受到干扰,在
app
受到干扰时,会产生一些系统事件
,这时
UIApplication
会通知它的
delegate
对象,让
delegate
代理来处理这些系统事件
•
•
delegate
可处理的事件包括
:
Ø
应用程序
的生命周期事件
(
如程序启动和关闭
)
Ø
系统
事件
(
如来电
)
Ø
内存警告
Ø
…
…
每次新建完项目,都有个带有“
AppDelegate
”字眼的类,它就是
UIApplication
的代理
l
MJAppDelegate
默认已经遵守了
UIApplicationDelegate
协议,已经是
UIApplication
的代理
iOS程序的启动过程
UIApplicationMain
•
main
函数中执行了
一个
UIApplicationMain
这个
函数
•
•
int
UIApplicationMain
(
int
argc,
char
*argv[],
NSString
*principalClassName,
NSString
*delegateClassName)
;
Ø
argc
、
argv
:直接传递给
UIApplicationMain
进行相关处
理即
可
Ø
Ø
principalClassName
:
指定应用程序类
名
(
app
的象征
),
该类必须是
UIApplication
(
或子类
)
。如果为
nil,
则
用
UIApplication
类作为默认值
Ø
Ø
delegateClassName
:
指定应用程序的代理类
,该类必须遵守
UIApplicationDelegate
协议
•
UIApplicationMain
函数会根据
principalClassName
创
建
UIApplication
对
象,根据
delegateClassName
创建一个
delegate
对象,并将该
delegate
对象赋值给
UIApplication
对
象中的
delegate
属性
•
•
接着会建立应用程序的
M
ain
R
unloop
(事件循环),进行事件的处理
(
首先会
在程序完毕后
调
用
delegate
对
象的
application:didFinishLaunchingWithOptions:
方法
)
•
•
程序正常退出时
UIApplicationMain
函数才返回
UIWindow
•
UIWindow
是一种特殊的
UIView
,通常在一个
app
中只
会有一个
UIWindow
•
•
iOS
程序启动完毕后,创建的第一个视图控件就是
UIWindow
,接着创建控制器的
view
,最后将控制器的
view
添加到
UIWindow
上,于是控制器的
view
就显示在屏幕上了
•
•
一个
iOS
程序之所以能显示到屏幕上,完全是因为它有
UIWindow
•
•
也就说,没有
UIWindow
,就看不见任何
UI
界面
•
添加
UIView
到
UIWindow
中两种常见方式
:
Ø
- (
void
)addSubview:(
UIView
*)view;
直接将view添加到UIWindow中,但并不会理会view对应的UIViewController
Ø
@property
(
nonatomic
,
retain
)
UIViewController
*
rootViewController
;
自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期
•
常用方法
Ø
- (
void
)makeKeyWindow
;
让当前UIWindow变成keyWindow(主窗口)
Ø
Ø
- (
void
)makeKeyAndVisible;
让当前UIWindow变成keyWindow,并显示出来
UIWindow的获得
•
[
UIApplication
sharedApplication
].
windows
在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
(平时输入文字弹出的键盘,就处在一个新的UIWindow中)
•
[
UIApplication
sharedApplication
].
keyWindow
用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
•
view.
window
获得某个UIView所在的UIWindow
四大对象关系图