部分(15)

UIApplication的核心作用是提供了iOS程序運(yùn)行期間的控制和協(xié)作工作。
每一個程序在運(yùn)行期必須有且僅有一個UIApplication(或則其子類)的一個實例?;叵胍幌挛以谇懊娴奈恼隆癿ain函數(shù)研究”的文章中提到的main函數(shù)的代碼,可以看出,在程序開始運(yùn)行的時候,UIApplicationMain函數(shù)是程序進(jìn)入點(diǎn),這個函數(shù)做了很多工作,其中一個重要的工作就是創(chuàng)建一個UIApplication的單例實例。在你的代碼中你,你可以通過調(diào)用[UIApplication sharedApplication]來得到這個單例實例的指針。
UIApplication的一個主要工作是處理用戶事件,它會維護(hù)一個隊列,把所有用戶事件都放入隊列,逐個處理,在處理的時候,它會發(fā)送當(dāng)前事件到一個合適的處理事件的目標(biāo)控件。此外,UIApplication實例還維護(hù)一個在本應(yīng)用中打開的window列表(UIWindow實例),這樣它就可以接觸應(yīng)用中的任何一個UIView對象。UIApplication實例會被賦予一個代理對象,以處理應(yīng)用程序的生命周期事件(比如程序啟動和關(guān)閉)、系統(tǒng)事件(比如來電、記事項警告)等等。
新建一個任意類型的iOS應(yīng)用工程,在ClassPrefix輸入是TC,我們可以看到工程中生成一個類:
TCAppDelegate:UIResponder <UIApplicationDelegate>
這里這個類的基類是UIResponder,和4.2以前生成的工程是不同的,以前是繼承自NSObject。不論如何,本類實現(xiàn)了一個名叫UIApplicationDelegate的接口,這個表明這個類就是這個工程中UIApplication實例的代理類。
在main函數(shù)中,
@autoreleasepool {
return UIApplicationMain(argc,argv, nil,NSStringFromClass([TCAppDelegateclass****]));
}
這里傳入了代理類到UIApplicationMain函數(shù)中,UIApplicationMain函數(shù)在生成唯一個UIApplication的時候就可以把代理類的實例指針告訴這個單例對象了。
可以通過如下代碼獲UIApplication代理對象:
TCAppDelegate *myDelegate =(TCAppDelegate *)[UIApplication sharedApplication].delegate;
在UIApplication接收到系統(tǒng)事件和生命周期事件時,會把相應(yīng)的事件傳遞給UIApplicationDelegate進(jìn)行處理,下表所列的生命周期函數(shù)大都是可選的,但為了應(yīng)用程序的健壯性程序員應(yīng)該實現(xiàn)它們。
UIApplicationDelegate Event-Handling Methods
Method Signature
1:application:didChangeStatusBarFrame:
- (void)application:(UIApplication*)applicationdidChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
2:application:didChangeStatusBarOrientation:
- (void)application:(UIApplication*)applicationdidChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
3:application:handleOpenURL:
- (BOOL)application:(UIApplication)applicationhandleOpenURL:(NSURL)url
4:application:willChangeStatusBarOrientation:duration:
- (void)application:(UIApplication*)applicationwillChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientationduration:(NSTimeInterval)duration
5:application:willChangeStatusBarFrame
- (void)application:(UIApplication)applicationwillChangeStatusBarFrame:(CGRect)newStatusBarFrame
6:applicationDidBecomeActive:
- (void)applicationDidBecomeActive:(UIApplication*)application
7:applicationDidFinishLaunching:
-(void)applicationDidFinishLaunching:(UIApplication*)application
8:applicationDidReceiveMemoryWarning:
-(void)applicationDidReceiveMemoryWarning:(UIApplication*)application
9:applicationSignificantTimeChange:
-(void)applicationSignificantTimeChange:(UIApplication*)application
10:applicationWillResignActive:
- (void)applicationWillResignActive:(UIApplication*)application
11:applicationWillTerminate:
- (void)applicationWillTerminate:(UIApplication*)application
1、- (void)applicationWillResignActive:(UIApplication*)application
說明:當(dāng)應(yīng)用程序?qū)⒁敕腔顒訝顟B(tài)執(zhí)行,在此期間,應(yīng)用程序不接收消息或事件,比如來電話了
2、- (void)applicationDidBecomeActive:(UIApplication*)application
說明:當(dāng)應(yīng)用程序入活動狀態(tài)執(zhí)行,這個剛好跟上面那個方法相反
3、- (void)applicationDidEnterBackground:(UIApplication*)application
說明:當(dāng)程序被推送到后臺的時候調(diào)用。所以要設(shè)置后臺繼續(xù)運(yùn)行,則在這個函數(shù)里面設(shè)置即可
4、- (void)applicationWillEnterForeground:(UIApplication*)application
說明:當(dāng)程序從后臺將要重新回到前臺時候調(diào)用,這個剛好跟上面的那個方法相反。
5、- (void)applicationWillTerminate:(UIApplication *)application
說明:當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application
說明:iPhone設(shè)備只有有限的內(nèi)存,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會終止應(yīng)用程序的運(yùn)行,在終止前會執(zhí)行這個方法,通常可以在這里進(jìn)行內(nèi)存清理工作防止程序被終止
7、-(void)applicationSignificantTimeChange:(UIApplication*)application
說明:當(dāng)系統(tǒng)時間發(fā)生改變時執(zhí)行
8、-(void)applicationDidFinishLaunching:(UIApplication*)application
說明:當(dāng)程序載入后執(zhí)行
9、- (void)application:(UIApplication)applicationwillChangeStatusBarFrame:(CGRect)newStatusBarFrame
說明:當(dāng)StatusBar框?qū)⒁兓瘯r執(zhí)行
10、- (void)application:(UIApplication*)applicationwillChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
說明:當(dāng)StatusBar框方向?qū)⒁兓瘯r執(zhí)行
11、- (BOOL)application:(UIApplication)applicationhandleOpenURL:(NSURL)url
說明:當(dāng)通過url執(zhí)行
12、- (void)application:(UIApplication*)applicationdidChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
說明:當(dāng)StatusBar框方向變化完成后執(zhí)行
13、- (void)application:(UIApplication*)applicationdidChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
說明:當(dāng)StatusBar框變化完成后執(zhí)行
iPhone中的應(yīng)用程序很容易受到打擾,比如一個來電可能導(dǎo)致應(yīng)用程序失去焦點(diǎn),如果這個時候接聽了電話,那么應(yīng)用程序會轉(zhuǎn)到后臺運(yùn)行。還有很多其它類似的事件會導(dǎo)致iPhone應(yīng)用程序失去焦點(diǎn),在應(yīng)用程序失去焦點(diǎn)前會調(diào)用委托類的applicationWillResignActive()方法,而應(yīng)用程序再次獲取到焦點(diǎn)的時候會調(diào)用applicationDidBecomeActive()方法。比如在運(yùn)行應(yīng)用程序的時候鎖屏?xí){(diào)用委托類的applicationWillResignActive()方法,而當(dāng)屏幕被解鎖的時候,又會調(diào)用applicationDidBecomeActive()方法。
另外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),因為iPhone設(shè)備只有有限的內(nèi)存,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會終止應(yīng)用程序的運(yùn)行,但在終止之前操作系統(tǒng)會通過先調(diào)用委托類的applicationDidReceiveMemoryWarning()方法警告應(yīng)用程序,在UIApplication接收到這個事件后它會傳遞給委托類的applicationDidReceiveMemoryWarning()方法,委托類在這個方法內(nèi)可以進(jìn)行釋放內(nèi)存的操作以防止操作系統(tǒng)強(qiáng)制終止應(yīng)用程序的運(yùn)行。
UIApplication的周期關(guān)鍵性步驟:
step 1,點(diǎn)擊 app icon 或者從應(yīng)用程序url(比如在Safari地址欄中輸入應(yīng)用程序url)啟動應(yīng)用程序。step 2,就會進(jìn)入 UIApplicationDelegate 的- (void)applicationDidFinishLaunching:(UIApplication *)application;或 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;step 3, 如果是從 url 啟動的則先進(jìn)入 UIApplicationDelegate 的- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;然后再跳轉(zhuǎn)到step 4;否則直接跳轉(zhuǎn)到step 4;step 4,進(jìn)入 UIApplicationDelegate 的- (void)applicationDidBecomeActive:(UIApplication *)application;step 5,進(jìn)入應(yīng)用程序主循環(huán),這時應(yīng)用程序已經(jīng)是活動的了,用戶可以與應(yīng)用程序交互。step 6,在 step 5 狀態(tài)下,如果按住 home 鍵或者進(jìn)行任務(wù)切換操作,然后跳轉(zhuǎn)到 step 8;step 7,在 step 5 狀態(tài)下,應(yīng)用程序被中斷(如來電,來短信),進(jìn)入 UIApplicationDelegate 的- (void)applicationWillResignActive:(UIApplication *)application;如果用戶選擇不處理繼續(xù)留在當(dāng)前應(yīng)用程序,則回到 step 4;如果用戶選擇處理,則跳轉(zhuǎn)到 step 8;step 8,進(jìn)入 UIApplicationDelegate 的- (void)applicationWillTerminate:(UIApplication *)application;當(dāng)前應(yīng)用程序關(guān)閉。
下面是這個類的一些功能:
1.設(shè)置icon上的數(shù)字圖標(biāo)
//設(shè)置主界面icon上的數(shù)字圖標(biāo),在2.0中引進(jìn), 缺省為0
[UIApplicationsharedApplication].applicationIconBadgeNumber =4;
2.設(shè)置搖動手勢的時候,是否支持redo,undo操作
//搖動手勢,是否支持redoundo操作。
//3.0以后引進(jìn),缺省YES
[UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;
3.判斷程序運(yùn)行狀態(tài)
//判斷程序運(yùn)行狀態(tài),在2.0以后引入
if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){
NSLog(@"程序在運(yùn)行狀態(tài)");
}
4.阻止屏幕變暗進(jìn)入休眠狀態(tài)
//阻止屏幕變暗,慎重使用,缺省為no2.0
[UIApplicationsharedApplication].idleTimerDisabled =YES;
慎重使用本功能,因為非常耗電。
5.顯示聯(lián)網(wǎng)狀態(tài)
//顯示聯(lián)網(wǎng)標(biāo)記 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;
6.在map上顯示一個地址
NSString* addressText =@"1 Infinite Loop,Cupertino, CA 95014";
// URL encode the spaces
addressText = [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@",addressText];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];
7.發(fā)送電子郵件
NSString *recipients=@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hellofrom California!";
NSString *body=@"&body=It is raining in sunnyCalifornia!";
NSString *email= [NSStringstringWithFormat:@"%@%@", recipients, body];
email =[emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];
8.打電話到一個號碼
// Call Google 411
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];
9.發(fā)送短信
// Text to Google SMS
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];
10.打開一個網(wǎng)址
// Lanuch any iPhone developers favsite
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];