一梗脾、UIApplication
1.簡單介紹
(1)UIApplication對(duì)象是應(yīng)用程序的象征,一個(gè)UIApplication對(duì)象就代表一個(gè)應(yīng)用程序繁涂。
(2)每一個(gè)應(yīng)用都有自己的UIApplication對(duì)象拱她,而且是單例的,如果試圖在程序中新建一個(gè)UIApplication對(duì)象扔罪,那么將報(bào)錯(cuò)提示秉沼。
(3)通過[UIApplication sharedApplication]可以獲得這個(gè)單例對(duì)象
(4) 一個(gè)iOS程序啟動(dòng)后創(chuàng)建的第一個(gè)對(duì)象就是UIApplication對(duì)象,且只有一個(gè)(通過代碼獲取兩個(gè)UIApplication對(duì)象矿酵,打印地址可以看出地址是相同的)唬复。
(5)利用UIApplication對(duì)象,能進(jìn)行一些應(yīng)用級(jí)別的操作
2.應(yīng)用級(jí)別的操作示例:
(1)設(shè)置應(yīng)用程序圖標(biāo)右上角的紅色提醒數(shù)字(如QQ全肮,微博等消息的時(shí)候敞咧,圖標(biāo)上面會(huì)顯示1,2辜腺,3條新信息等休建。)
@property(nonatomic) NSInteger applicationIconBadgeNumber;
代碼實(shí)現(xiàn)和效果:
- (void)viewDidLoad{
[super viewDidLoad];
//創(chuàng)建并添加一個(gè)按鈕
UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 100, 60, 30)];
[btn setTitle:@"按鈕" forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor brownColor]];
[btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
-(void)onClick{
NSLog(@"按鈕點(diǎn)擊事件");
//錯(cuò)誤,只能有一個(gè)唯一的UIApplication對(duì)象评疗,不能再進(jìn)行創(chuàng)建
// UIApplication *app=[[UIApplication alloc]init];
//通過sharedApplication獲取該程序的UIApplication對(duì)象
UIApplication *app=[UIApplication sharedApplication];
app.applicationIconBadgeNumber=123;
}
![](http://images.cnitblog.com/i/450136/201406/031925428496954.png)
(2)設(shè)置聯(lián)網(wǎng)指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
代碼和效果:
//設(shè)置指示器的聯(lián)網(wǎng)動(dòng)畫
app.networkActivityIndicatorVisible=YES;
![](http://images.cnitblog.com/i/450136/201406/031934196777226.png)
(3)管理狀態(tài)欄
- 從iOS7開始测砂,系統(tǒng)提供了2種管理狀態(tài)欄的方式
通過UIViewController管理(每一個(gè)UIViewController都可以擁有自己不同的狀態(tài)欄).
在iOS7中,默認(rèn)情況下百匆,狀態(tài)欄都是由UIViewController管理的砌些,UIViewController實(shí)現(xiàn)下列方法就可以輕松管理狀態(tài)欄的可見性和樣式
狀態(tài)欄的樣式
- (UIStatusBarStyle)preferredStatusBarStyle;
狀態(tài)欄的可見性
-(BOOL)prefersStatusBarHidden;
#pragma mark-設(shè)置狀態(tài)欄的樣式
-(UIStatusBarStyle)preferredStatusBarStyle{
//設(shè)置為白色
//return UIStatusBarStyleLightContent;
//默認(rèn)為黑色
return UIStatusBarStyleDefault;
}
#pragma mark-設(shè)置狀態(tài)欄是否隱藏(否)
-(BOOL)prefersStatusBarHidden{
return NO;
}
-
通過UIApplication管理(一個(gè)應(yīng)用程序的狀態(tài)欄都由它統(tǒng)一管理)
如果想利用UIApplication來管理狀態(tài)欄,首先得修改Info.plist的設(shè)置
//通過sharedApplication獲取該程序的UIApplication對(duì)象
UIApplication *app=[UIApplication sharedApplication];
app.applicationIconBadgeNumber=123;
//設(shè)置指示器的聯(lián)網(wǎng)動(dòng)畫
app.networkActivityIndicatorVisible=YES;
//設(shè)置狀態(tài)欄的樣式
//app.statusBarStyle=UIStatusBarStyleDefault;//默認(rèn)(黑色)
//設(shè)置為白色+動(dòng)畫效果
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
//設(shè)置狀態(tài)欄是否隱藏
app.statusBarHidden=YES;
//設(shè)置狀態(tài)欄是否隱藏+動(dòng)畫效果
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
- 補(bǔ)充
既然兩種都可以對(duì)狀態(tài)欄進(jìn)行管理加匈,那么什么時(shí)候該用什么呢存璃?
如果狀態(tài)欄的樣式只設(shè)置一次仑荐,那就用UIApplication來進(jìn)行管理;
如果狀態(tài)欄是否隱藏有巧,樣式不一樣那就用控制器進(jìn)行管理释漆。
UIApplication來進(jìn)行管理有額外的好處,可以提供動(dòng)畫
(4)openURL:方法
UIApplication有個(gè)功能十分強(qiáng)大的openURL:方法
-(BOOL)openURL:(NSURL*)url;
openURL:方法的部分功能有
打電話
UIApplication *app = [UIApplicationsharedApplication]; [app openURL:[NSURLURLWithString:@"tel://10086"]];
發(fā)短信 [app openURL:[NSURLURLWithString:@"sms://10086"]];
發(fā)郵件 [app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
打開一個(gè)網(wǎng)頁資源 [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
打開其他app程序 openURL方法篮迎,可以打開其他APP男图。
URL補(bǔ)充:
URL:統(tǒng)一資源定位符,用來唯一的表示一個(gè)資源甜橱。
URL格式:協(xié)議頭://主機(jī)地址/資源路徑
網(wǎng)絡(luò)資源:http/ ftp等 表示百度上一張圖片的地址 http://www.baidu.com/images/20140603/abc.png
本地資源:file:///users/apple/desktop/abc.png(主機(jī)地址省略)
二逊笆、UIApplication Delegate
1.簡單說明
所有的移動(dòng)操作系統(tǒng)都有個(gè)致命的缺點(diǎn):app很容易受到打擾。比如一個(gè)來電或者鎖屏?xí)?dǎo)致app進(jìn)入后臺(tái)甚至被終止岂傲。
還有很多其它類似的情況會(huì)導(dǎo)致app受到干擾难裆,在app受到干擾時(shí),會(huì)產(chǎn)生一些系統(tǒng)事件镊掖,這時(shí)UIApplication會(huì)通知它的delegate對(duì)象乃戈,讓delegate代理來處理這些系統(tǒng)事件。
作用:當(dāng)被打斷的時(shí)候亩进,通知代理進(jìn)入到后臺(tái)症虑。
![](http://images.cnitblog.com/i/450136/201406/031946238951275.png)
每次新建完項(xiàng)目,都有個(gè)帶有“AppDelegate”字眼的類归薛,它就是UIApplication的代理,NJAppDelegate默認(rèn)已經(jīng)遵守了UIApplicationDelegate協(xié)議谍憔,已經(jīng)是UIApplication的代理。
2.代理方法
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
// 當(dāng)應(yīng)用程序啟動(dòng)完畢的時(shí)候就會(huì)調(diào)用(系統(tǒng)自動(dòng)調(diào)用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
//當(dāng)應(yīng)用程序程序失去焦點(diǎn)的時(shí)候調(diào)用(系統(tǒng)自動(dòng)調(diào)用)
- (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
//當(dāng)程序進(jìn)入后臺(tái)的時(shí)候調(diào)用
//一般在這里保存應(yīng)用程序的數(shù)據(jù)和狀態(tài)
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
//將要進(jìn)入前臺(tái)的是時(shí)候調(diào)用
//一般在該方法中恢復(fù)應(yīng)用程序的數(shù)據(jù),以及狀態(tài)
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
//應(yīng)用程序獲得焦點(diǎn)
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
// 應(yīng)用程序即將被銷毀的時(shí)候會(huì)調(diào)用該方法
// 注意:如果應(yīng)用程序處于掛起狀態(tài)的時(shí)候無法調(diào)用該方法
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
應(yīng)用程序一般有五個(gè)狀態(tài):官方文檔app.states
三主籍、程序啟動(dòng)原理
UIApplicationMain
main函數(shù)中執(zhí)行了一個(gè)UIApplicationMain這個(gè)函數(shù)
intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
*argc习贫、argv:直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
*principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)千元。如果為nil,則用UIApplication類作為默認(rèn)值
1苫昌、delegateClassName:指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議
2诅炉、UIApplicationMain函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對(duì)象蜡歹,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象,并將該delegate對(duì)象賦值給UIApplication對(duì)象中的delegate屬性
接著會(huì)建立應(yīng)用程序的Main Runloop(事件循環(huán))涕烧,進(jìn)行事件的處理(首先會(huì)在程序完畢后調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時(shí)UIApplicationMain函數(shù)才返回
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
/*
argc: 系統(tǒng)或者用戶傳入的參數(shù)個(gè)數(shù)
argv: 系統(tǒng)或者用戶傳入的實(shí)際參數(shù)
1.根據(jù)傳入的第三個(gè)參數(shù)創(chuàng)建UIApplication對(duì)象
2.根據(jù)傳入的第四個(gè)產(chǎn)生創(chuàng)建UIApplication對(duì)象的代理
3.設(shè)置剛剛創(chuàng)建出來的代理對(duì)象為UIApplication的代理
4.開啟一個(gè)事件循環(huán)
*/
}
}
系統(tǒng)入口的代碼和參數(shù)說明:
argc:系統(tǒng)或者用戶傳入的參數(shù)
argv:系統(tǒng)或用戶傳入的實(shí)際參數(shù)
1.根據(jù)傳入的第三個(gè)參數(shù)月而,創(chuàng)建UIApplication對(duì)象
2.根據(jù)傳入的第四個(gè)產(chǎn)生創(chuàng)建UIApplication對(duì)象的代理
3.設(shè)置剛剛創(chuàng)建出來的代理對(duì)象為UIApplication的代理
4.開啟一個(gè)事件循環(huán)(可以理解為里面是一個(gè)死循環(huán))這個(gè)時(shí)間循環(huán)是一個(gè)隊(duì)列(先進(jìn)先出)先添加進(jìn)去的先處理
ios程序啟動(dòng)原理
![](http://images.cnitblog.com/i/450136/201406/031950050525709.png)
四、程序啟動(dòng)的完整過程
1.main函數(shù)
2.UIApplicationMain
- 創(chuàng)建UIApplication對(duì)象
- 創(chuàng)建UIApplication的delegate對(duì)象
3.delegate對(duì)象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard) - 程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的application:didFinishLaunchingWithOptions:方法
- 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
- 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口
3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
- 創(chuàng)建UIWindow
- 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口