UIApplication 用法解析

原文:http://blog.csdn.net/kindazrael/article/details/7913738?


UIApplication,代表的是整個應用做的事,因此每個程序只能有一個,系統(tǒng)使用的是單例模式,就是上面的[UIApplication sharedApplication]來得到一個實例。這個單例實

例是在系統(tǒng)啟動時由main函數(shù)里面的UIApplicationMain方法生成,就是每個程序里都有的AppDelegate,它實現(xiàn)了UIApplicationDelegate的Protocol,也就是AppDelegate的一

個實例。每次通過[UIApplication?sharedApplication]調(diào)用的就是它。

UIApplication在程序里的角色:它保存一個UIWindow對象序列,用來快速恢復views

UIApplication的核心作用是提供了iOS程序運行期間的控制和協(xié)作工作。

每一個程序在運行期必須有且僅有一個UIApplication(或則其子類)的一個實例?;叵胍幌挛以谇懊娴奈恼隆癿ain函數(shù)研究”的文章中提到的main函數(shù)的代碼,可以看出,在

程序開始運行的時候,UIApplicationMain函數(shù)是程序進入點,這個函數(shù)做了很多工作,其中一個重要的工作就是創(chuàng)建一個UIApplication的單例實例。在你的代碼中你,你可以

通過調(diào)用[UIApplication?sharedApplication]來得到這個單例實例的指針。

UIApplication的一個主要工作是處理用戶事件,它會起一個隊列,把所有用戶事件都放入隊列,逐個處理,在處理的時候,它會發(fā)送當前事件到一個合適的處理事件的目標控

件。此外,UIApplication實例還維護一個在本應用中打開的window列表(UIWindow實例),這樣它就可以接觸應用中的任何一個UIView對象。UIApplication實例會被賦予一個

代理對象,以處理應用程序的生命周期事件(比如程序啟動和關閉)、系統(tǒng)事件(比如來電、記事項警告)等等。

新建一個任意類型的iOS應用工程,加入我們在Class?Prefix輸入是TC,我們可以看到工程中生成一個類:

TCAppDelegate?:UIResponder?

這里這個類的基類是UIResponder,和4.2以前生成的工程是不同的,以前是繼承自NSObject。不論如何,本類實現(xiàn)了一個名叫UIApplicationDelegate的接口,這個表明這個類

就是這個工程中UIApplication實例的代理類。

在main函數(shù)中,

@autoreleasepool?{

returnUIApplicationMain(argc,?argv,?nil,NSStringFromClass([TCAppDelegateclass]));

}

這里傳入了代理類到UIApplicationMain函數(shù)中,UIApplicationMain函數(shù)在生成唯一個UIApplication的時候就可以把代理類的實例指針告訴這個單例對象了。

1、-?(void)applicationWillResignActive:(UIApplication?*)application

說明:當應用程序將要入非活動狀態(tài)執(zhí)行,在此期間,應用程序不接收消息或事件,比如來電話了

2、-?(void)applicationDidBecomeActive:(UIApplication?*)application

說明:當應用程序入活動狀態(tài)執(zhí)行,這個剛好跟上面那個方法相反

3、-?(void)applicationDidEnterBackground:(UIApplication?*)application

說明:當程序被推送到后臺的時候調(diào)用。所以要設置后臺繼續(xù)運行,則在這個函數(shù)里面設置即可

4、-?(void)applicationWillEnterForeground:(UIApplication?*)application

說明:當程序從后臺將要重新回到前臺時候調(diào)用,這個剛好跟上面的那個方法相反。

5、-?(void)applicationWillTerminate:(UIApplication?*)application

說明:當程序將要退出是被調(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵值。

6、-?(void)applicationDidReceiveMemoryWarning:(UIApplication?*)application

說明:iPhone設備只有有限的內(nèi)存,如果為應用程序分配了太多內(nèi)存操作系統(tǒng)會終止應用程序的運行,在終止前會執(zhí)行這個方法,通??梢栽谶@里進行內(nèi)存清理工作防止程序被終止

7、-?(void)applicationSignificantTimeChange:(UIApplication*)application

說明:當系統(tǒng)時間發(fā)生改變時執(zhí)行

8、-?(void)applicationDidFinishLaunching:(UIApplication*)application

說明:當程序載入后執(zhí)行

9、-?(void)application:(UIApplication)application?willChangeStatusBarFrame:(CGRect)newStatusBarFrame

說明:當StatusBar框將要變化時執(zhí)行

10、-?(void)application:(UIApplication*)application?willChangeStatusBarOrientation:

(UIInterfaceOrientation)newStatusBarOrientation

duration:(NSTimeInterval)duration

說明:當StatusBar框方向將要變化時執(zhí)行

11、-?(BOOL)application:(UIApplication*)application?handleOpenURL:(NSURL*)url

說明:當通過url執(zhí)行

12、-?(void)application:(UIApplication*)application?didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

說明:當StatusBar框方向變化完成后執(zhí)行

13、-?(void)application:(UIApplication*)application?didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

說明:當StatusBar框變化完成后執(zhí)行

iPhone中的應用程序很容易受到打擾,比如一個來電可能導致應用程序失去焦點,如果這個時候接聽了電話,那么應用程序會轉到后臺運行。還有很多其它類似的事件會導致

iPhone應用程序失去焦點,在應用程序失去焦點前會調(diào)用委托類的applicationWillResignActive()方法,而應用程序再次獲取到焦點的時候會調(diào)用

applicationDidBecomeActive()方法。比如在運行應用程序的時候鎖屏會調(diào)用委托類的applicationWillResignActive()方法,而當屏幕被解鎖的時候,又會調(diào)用

applicationDidBecomeActive()方法。

另外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),因為iPhone設備只有有限的內(nèi)存,如果為應用程序分配了太多內(nèi)存操作系統(tǒng)會終止應用程序的運行,但

在終止之前操作系統(tǒng)會通過先調(diào)用委托類的applicationDidReceiveMemoryWarning()方法警告應用程序,在UIApplication接收到這個事件后它會傳遞給委托類的

applicationDidReceiveMemoryWarning()方法,委托類在這個方法內(nèi)可以進行釋放內(nèi)存的操作以防止操作系統(tǒng)強制終止應用程序的運行。

下面是這個類的一些功能:

UIApplication還可以遠程提醒,就是push?notification注冊;

可以連接到UIUndoManager;

檢查能否打開某個URL,并且打開URL;這個功能可以配合應用的自定義URL功能,來檢測是否安裝了某個應用。比如檢測是否安裝了淘寶的應用,可以用下面的代碼:

NSURL?*url?=?[NSURL?URLWithString:[NSString?stringWithFormat:@"taobao://item.taobao.com/item.htm?id=12688928896"]];

//?判斷當前系統(tǒng)是否有安裝淘寶客戶端

if([[UIApplication?sharedApplication]?canOpenURL:url])?{

//?如果已經(jīng)安裝淘寶客戶端,就使用客戶端打開鏈接

[[UIApplication?sharedApplication]?openURL:url];

}

NSURL?*url?=?[NSURL?URLWithString:[NSString?stringWithFormat:@"taobao://item.taobao.com/item.htm?id=12688928896"]];

//?判斷當前系統(tǒng)是否有安裝淘寶客戶端

if([[UIApplication?sharedApplication]?canOpenURL:url])?{

//?如果已經(jīng)安裝淘寶客戶端,就使用客戶端打開鏈接

[[UIApplication?sharedApplication]?openURL:url];

}

1.設置icon上的數(shù)字圖標

//設置主界面icon上的數(shù)字圖標,在2.0中引進,?缺省為0

[UIApplication?sharedApplication].applicationIconBadgeNumber?=?4;

2.設置搖動手勢的時候,是否支持redo,undo操作

//搖動手勢,是否支持redo?undo操作。

//3.0以后引進,缺省YES

[UIApplication?sharedApplication].applicationSupportsShakeToEdit?=YES;

3.判斷程序運行狀態(tài)

//判斷程序運行狀態(tài),在2.0以后引入

/*

UIApplicationStateActive,

UIApplicationStateInactive,

UIApplicationStateBackground

*/

if([UIApplication?sharedApplication].applicationState?==?UIApplicationStateInactive){

NSLog(@"程序在運行狀態(tài)");

}

4.阻止屏幕變暗進入休眠狀態(tài)

//阻止屏幕變暗,慎重使用,缺省為no?2.0

[UIApplication?sharedApplication].idleTimerDisabled?=?YES;

慎重使用本功能,因為非常耗電。

5.顯示聯(lián)網(wǎng)狀態(tài)

//顯示聯(lián)網(wǎng)標記?2.0

[UIApplication?sharedApplication].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];

[[UIApplication?sharedApplication]openURL:[NSURLURLWithString:urlText]];

7.發(fā)送電子郵件

NSString?*recipients?=@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello?from?California!";

NSString?*body?=@"&body=It?is?raining?in?sunny?California!";

NSString?*email?=?[NSStringstringWithFormat:@"%@%@",?recipients,?body];

email?=?[emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplication?sharedApplication]openURL:[NSURLURLWithString:email]];

8.打電話到一個號碼

//?Call?Google?411

[[UIApplication?sharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];

9.發(fā)送短信

//?Text?to?Google?SMS

[[UIApplication?sharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

10.打開一個網(wǎng)址

//?Lanuch?any?iPhone?developers?fav?site

[[UIApplication?sharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容