UIApplication和delegate以及程序启动过程

什么是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(nonatomicNSInteger 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 程序


UIApplicationdelegate
所有的移动操作系统都有个致命的缺点: 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 ;

自动将rootViewControllerview添加到UIWindow,负责管理rootViewController的生命周期

常用方法
Ø - ( void )makeKeyWindow ;

让当前UIWindow变成keyWindow(主窗口)

Ø
Ø - ( void )makeKeyAndVisible;

让当前UIWindow变成keyWindow,并显示出来



UIWindow的获得
[ UIApplication sharedApplication ]. windows

在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView

(平时输入文字弹出的键盘就处在一个新的UIWindow)

[ UIApplication sharedApplication ]. keyWindow

用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindowkeyWindow如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow

view. window

获得某个UIView所在的UIWindow




四大对象关系图







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值