什么是UIApplication
- UIApplication對(duì)象是應(yīng)用程序的象征,一個(gè)UIApplication就代表一個(gè)應(yīng)用程序
- 每一個(gè)應(yīng)用程序都有自己的UIApplication對(duì)象,而且是單例的
- l通過[UIApplicationsharedApplication]可以獲得這個(gè)單例對(duì)象
- l利用UIApplication對(duì)象,能進(jìn)行一些應(yīng)用級(jí)別的操作
UIApplication的常用屬性
- l設(shè)置應(yīng)用程序圖標(biāo)右上角的紅色提醒數(shù)字
@property(nonatomic)NSIntegerapplicationIconBadgeNumber;
FF36CF5C-B3D0-42BA-9D7A-8E312084AA8B.png
- 設(shè)置聯(lián)網(wǎng)指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible)BOOLnetworkActivityIndicatorVisible;
91FD1AE7-97A6-48A3-A47E-731C2BB8DDB2.png
- 利用UIApplication來管理狀態(tài)欄
//通過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];
- 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)頁(yè)資源 [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
打開其他app程序 openURL方法,可以打開其他APP。
UIApplication和delegate
- 所有的移動(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)事件。
- delegate可處理的事件包括:
- 應(yīng)用程序的生命周期事件(如程序的啟動(dòng)和關(guān)閉)
- 系統(tǒng)事件(如來電)
- 內(nèi)存警告
C1189BA6-E199-4B13-B0C4-F53611DD03B0.png
UIApplicationDelegate
9B01F687-BEB9-4928-B508-3813DC5657B0.png
- 代理方法
#import "YYAppDelegate.h"
2
3 @implementation YYAppDelegate
4
5 // 當(dāng)應(yīng)用程序啟動(dòng)完畢的時(shí)候就會(huì)調(diào)用(系統(tǒng)自動(dòng)調(diào)用)
6 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
7 {
8 NSLog(@"didFinishLaunchingWithOptions");
9 return YES;
10 }
11
12 // 即將失去活動(dòng)狀態(tài)的時(shí)候調(diào)用(失去焦點(diǎn), 不可交互)
13 - (void)applicationWillResignActive:(UIApplication *)application
14 {
15 NSLog(@"ResignActive");
16 }
17
18 // 重新獲取焦點(diǎn)(能夠和用戶交互)
19 - (void)applicationDidBecomeActive:(UIApplication *)application
20 {
21 NSLog(@"BecomeActive");
22 }
23
24 // 應(yīng)用程序進(jìn)入后臺(tái)的時(shí)候調(diào)用
25 // 一般在該方法中保存應(yīng)用程序的數(shù)據(jù), 以及狀態(tài)
26 - (void)applicationDidEnterBackground:(UIApplication *)application
27 {
28 NSLog(@"Background");
29 }
30
31 // 應(yīng)用程序即將進(jìn)入前臺(tái)的時(shí)候調(diào)用
32 // 一般在該方法中恢復(fù)應(yīng)用程序的數(shù)據(jù),以及狀態(tài)
33 - (void)applicationWillEnterForeground:(UIApplication *)application
34 {
35 NSLog(@"Foreground");
36 }
37
38 // 應(yīng)用程序即將被銷毀的時(shí)候會(huì)調(diào)用該方法
39 // 注意:如果應(yīng)用程序處于掛起狀態(tài)的時(shí)候無法調(diào)用該方法
40 - (void)applicationWillTerminate:(UIApplication *)application
41 {
42 }
43
44 // 應(yīng)用程序接收到內(nèi)存警告的時(shí)候就會(huì)調(diào)用
45 // 一般在該方法中釋放掉不需要的內(nèi)存
46 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
47 {
48 NSLog(@"MemoryWarning");
49 }
50 @end
程序啟動(dòng)原理
C93667DD-C603-4E90-92CA-E8B7582D68CF.png
- main函數(shù)中執(zhí)行了一個(gè)UIApplicationMain這個(gè)函數(shù)
- lintUIApplicationMain(intargc, charargv[], NSStringprincipalClassName, NSString*delegateClassName);
- argc、argv:直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
- principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認(rèn)值
- delegateClassName:指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議
- lUIApplicationMain函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對(duì)象,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象,并將該delegate對(duì)象賦值給UIApplication對(duì)象中的delegate屬性
- l接著會(huì)建立應(yīng)用程序的Main Runloop(事件循環(huán)),進(jìn)行事件的處理(首先會(huì)在程序完畢后調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法)
- l程序正常退出時(shí)UIApplicationMain函數(shù)才返回