UIApplication常用的代理方法和屬性

UIApplication深入研究

很多時(shí)候,我們不需要關(guān)心這個類,我們很少繼承這個類,偶爾會調(diào)用這個類的api來實(shí)現(xiàn)一些功能,但是不可否認(rèn),這個類是iOS編程中很重要的一個概念,所以我這里寫這個文章來總結(jié)以下這個類的信息,如果寫的不對的地方,請留言,多謝。

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

每一個程序在運(yùn)行期必須有且僅有一個UIApplication(或則其子類)的一個實(shí)例?;叵雖ain函數(shù)的代碼,可以看出,在程序開始運(yùn)行的時(shí)候,UIApplicationMain函數(shù)是程序進(jìn)入點(diǎn),這個函數(shù)做了很多工作,其中一個重要的工作就是創(chuàng)建一個UIApplication的單例實(shí)例。在你的代碼中,你可以通過調(diào)用[UIApplication sharedApplication]來得到這個單例實(shí)例的指針。

UIApplication的一個主要工作是處理用戶事件,它會起一個隊(duì)列,把所有用戶事件都放入隊(duì)列,逐個處理,在處理的時(shí)候,它會發(fā)送當(dāng)前事件到一個合適的處理事件的目標(biāo)控件。此外,UIApplication實(shí)例還維護(hù)一個在本應(yīng)用中打開的window列表(UIWindow實(shí)例),這樣它就可以接觸應(yīng)用中的任何一個UIView對象。UIApplication實(shí)例會被賦予一個代理對象,以處理應(yīng)用程序的生命周期事件(比如程序啟動和關(guān)閉)、系統(tǒng)事件(比如來電、記事項(xiàng)警告)等等。

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

TCAppDelegate :UIResponder

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

在main函數(shù)中,

@autoreleasepool{

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

}

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

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)程序被推送到后臺的時(shí)候調(diào)用。所以要設(shè)置后臺繼續(xù)運(yùn)行,則在這個函數(shù)里面設(shè)置即可

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

說明:當(dāng)程序從后臺將要重新回到前臺時(shí)候調(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)時(shí)間發(fā)生改變時(shí)執(zhí)行

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

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

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

說明:當(dāng)StatusBar框?qū)⒁兓瘯r(shí)執(zhí)行

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

(UIInterfaceOrientation)newStatusBarOrientation

duration:(NSTimeInterval)duration

說明:當(dāng)StatusBar框方向?qū)⒁兓瘯r(shí)執(zhí)行

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

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

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

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

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

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

iPhone中的應(yīng)用程序很容易受到打擾,比如一個來電可能導(dǎo)致應(yīng)用程序失去焦點(diǎn),如果這個時(shí)候接聽了電話,那么應(yīng)用程序會轉(zhuǎn)到后臺運(yùn)行。還有很多其它類似的事件會導(dǎo)致iPhone應(yīng)用程序失去焦點(diǎn),在應(yīng)用程序失去焦點(diǎn)前會調(diào)用委托類的applicationWillResignActive()方法,而應(yīng)用程序再次獲取到焦點(diǎn)的時(shí)候會調(diào)用applicationDidBecomeActive()方法。比如在運(yùn)行應(yīng)用程序的時(shí)候鎖屏?xí){(diào)用委托類的applicationWillResignActive()方法,而當(dāng)屏幕被解鎖的時(shí)候,又會調(diào)用applicationDidBecomeActive()方法。

另外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),因?yàn)閕Phone設(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)行。

================================================================================

下面是這個類的一些屬性:

1.設(shè)置icon上的數(shù)字圖標(biāo)

//設(shè)置主界面icon上的數(shù)字圖標(biāo),在2.0中引進(jìn),缺省為0

[UIApplicationsharedApplication].applicationIconBadgeNumber= 4;

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

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

//3.0以后引進(jìn),缺省YES

[UIApplicationsharedApplication].applicationSupportsShakeToEdit=YES;

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

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

/*

UIApplicationStateActive,

UIApplicationStateInactive,

UIApplicationStateBackground

*/

if([UIApplicationsharedApplication].applicationState==UIApplicationStateInactive){

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

}

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

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

[UIApplicationsharedApplication].idleTimerDisabled=YES;

慎重使用本功能,因?yàn)榉浅:碾姟?/p>

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=Hello from California!";

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

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 fav site

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

================================================================================

下面主要介紹一些UIApplicationDelegate中幾個常用的回調(diào)方法的調(diào)用時(shí)機(jī)。

以幫助你判斷哪些方法倒底放到哪個回調(diào)中去實(shí)現(xiàn)。

1.– (void)applicationDidFinishLaunching:(UIApplication *)application;

此方法基本已經(jīng)棄用,改用第2個方法代替。

2.– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsNS_AVAILABLE_IOS(3_0);

當(dāng)應(yīng)用程序啟動時(shí)(不包括已在后臺的情況下轉(zhuǎn)到前臺),調(diào)用此回調(diào)。launchOptions是啟動參數(shù),假如用戶通過點(diǎn)擊push通知啟動的應(yīng)用,這個參數(shù)里會存儲一些push通知的信息。

3.– (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.

當(dāng)應(yīng)用程序全新啟動,或者在后臺轉(zhuǎn)到前臺,完全激活時(shí),都會調(diào)用這個方法。如果應(yīng)用程序是以前運(yùn)行在后臺,這時(shí)可以選擇刷新用戶界面。

4.– (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 throttle down OpenGL ES frame rates. Games should use this method to pause the game.

當(dāng)應(yīng)用從活動狀態(tài)主動到非活動狀態(tài)的應(yīng)用程序時(shí)會調(diào)用這個方法。這可導(dǎo)致產(chǎn)生某些類型的臨時(shí)中斷(如傳入電話呼叫或SMS消息)?;蛘弋?dāng)用戶退出應(yīng)用程序,它開始過渡到的背景狀態(tài)。使用此方法可以暫停正在進(jìn)行的任務(wù),禁用定時(shí)器,降低OpenGL ES的幀速率。游戲應(yīng)該使用這種方法來暫停游戲。

調(diào)用時(shí)機(jī)可能有以下幾種:鎖屏,按HOME鍵,下接狀態(tài)欄,雙擊HOME鍵彈出低欄,等情況。

5.– (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;

// Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:

這個方法已不再支持,可能會在以后某個版本中去掉。建議用下面第6個方法代替

6.– (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotationNS_AVAILABLE_IOS(4_2);

// no equiv. notification. return NO if the application can’t open for some reason

當(dāng)用戶通過其它應(yīng)用啟動本應(yīng)用時(shí),會回調(diào)這個方法,url參數(shù)是其它應(yīng)用調(diào)用openURL:方法時(shí)傳過來的。

7.– (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;

// try to clean up as much memory as possible. next step is to terminate app

當(dāng)應(yīng)用可用內(nèi)存不足時(shí),會調(diào)用此方法,在這個方法中,應(yīng)該盡量去清理可能釋放的內(nèi)存。如果實(shí)在不行,可能會被強(qiáng)行退出應(yīng)用。

8.– (void)applicationWillTerminate:(UIApplication *)application;

// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

當(dāng)應(yīng)用退出,并且進(jìn)程即將結(jié)束時(shí)會調(diào)到這個方法,一般很少主動調(diào)到,更多是內(nèi)存不足時(shí)是被迫調(diào)到的,我們應(yīng)該在這個方法里做一些數(shù)據(jù)存儲操作。

9. //one of these will be called after calling -registerForRemoteNotifications

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)errorNS_AVAILABLE_IOS(3_0);

當(dāng)客戶端注冊遠(yuǎn)程通知時(shí),會回調(diào)上面兩個方法。

如果成功,則回調(diào)第一個,客戶端把deviceToken取出來發(fā)給服務(wù)端,push消息的時(shí)候要用。

如果失敗了,則回調(diào)第二個,可以從error參數(shù)中看一下失敗原因。

注:注冊遠(yuǎn)程通知使用如下方法:

UIRemoteNotificationType t=UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:t];

10.– (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfoNS_AVAILABLE_IOS(3_0);

當(dāng)應(yīng)用在前臺運(yùn)行中,收到遠(yuǎn)程通知時(shí),會回調(diào)這個方法。

當(dāng)應(yīng)用在后臺狀態(tài)時(shí),點(diǎn)擊push消息啟動應(yīng)用,也會回調(diào)這個方法。

11.– (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notificationNS_AVAILABLE_IOS(4_0);

當(dāng)應(yīng)用收到本地通知時(shí)會調(diào)這個方法,同上面一個方法類似。

如果在前臺運(yùn)行狀態(tài)直接調(diào)用,如果在后臺狀態(tài),點(diǎn)擊通知啟動時(shí),也會回調(diào)這個方法

本地通知可見另一篇文章:http://bluevt.org/?p=70

12.– (void)applicationDidEnterBackground:(UIApplication *)applicationNS_AVAILABLE_IOS(4_0);

// 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.

當(dāng)用戶從臺前狀態(tài)轉(zhuǎn)入后臺時(shí),調(diào)用此方法。使用此方法來釋放資源共享,保存用戶數(shù)據(jù),無效計(jì)時(shí)器,并儲存足夠的應(yīng)用程序狀態(tài)信息的情況下被終止后,將應(yīng)用程序恢復(fù)到目前的狀態(tài)。如果您的應(yīng)用程序支持后臺運(yùn)行,這種方法被調(diào)用,否則調(diào)用applicationWillTerminate:用戶退出。

13.– (void)applicationWillEnterForeground:(UIApplication *)applicationNS_AVAILABLE_IOS(4_0);

// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.

當(dāng)應(yīng)用在后臺狀態(tài),將要進(jìn)行動前臺運(yùn)行狀態(tài)時(shí),會調(diào)用此方法。

如果應(yīng)用不在后臺狀態(tài),而是直接啟動,則不會回調(diào)此方法。

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

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

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