UIApplication初探

部分(15)

目錄(?)[+]

UIApplication的核心作用是提供了iOS程序運(yùn)行期間的控制和協(xié)作工作喳瓣。
每一個(gè)程序在運(yùn)行期必須有且僅有一個(gè)UIApplication(或則其子類)的一個(gè)實(shí)例畏陕》绿希回想一下我在前面的文章“main函數(shù)研究”的文章中提到的main函數(shù)的代碼犹芹,可以看出腰埂,在程序開(kāi)始運(yùn)行的時(shí)候蜈膨,UIApplicationMain函數(shù)是程序進(jìn)入點(diǎn),這個(gè)函數(shù)做了很多工作驴一,其中一個(gè)重要的工作就是創(chuàng)建一個(gè)UIApplication的單例實(shí)例灶壶。在你的代碼中你,你可以通過(guò)調(diào)用[UIApplication sharedApplication]來(lái)得到這個(gè)單例實(shí)例的指針胸懈。
UIApplication的一個(gè)主要工作是處理用戶事件箫荡,它會(huì)維護(hù)一個(gè)隊(duì)列渔隶,把所有用戶事件都放入隊(duì)列洁奈,逐個(gè)處理,在處理的時(shí)候呈野,它會(huì)發(fā)送當(dāng)前事件到一個(gè)合適的處理事件的目標(biāo)控件印叁。此外轮蜕,UIApplication實(shí)例還維護(hù)一個(gè)在本應(yīng)用中打開(kāi)的window列表(UIWindow實(shí)例),這樣它就可以接觸應(yīng)用中的任何一個(gè)UIView對(duì)象率触。UIApplication實(shí)例會(huì)被賦予一個(gè)代理對(duì)象汇竭,以處理應(yīng)用程序的生命周期事件(比如程序啟動(dòng)和關(guān)閉)穴张、系統(tǒng)事件(比如來(lái)電皂甘、記事項(xiàng)警告)等等悼凑。
新建一個(gè)任意類型的iOS應(yīng)用工程,在ClassPrefix輸入是TC益老,我們可以看到工程中生成一個(gè)類:
TCAppDelegate:UIResponder <UIApplicationDelegate>
這里這個(gè)類的基類是UIResponder寸莫,和4.2以前生成的工程是不同的膘茎,以前是繼承自NSObject。不論如何态坦,本類實(shí)現(xiàn)了一個(gè)名叫UIApplicationDelegate的接口棒拂,這個(gè)表明這個(gè)類就是這個(gè)工程中UIApplication實(shí)例的代理類。
在main函數(shù)中谜诫,

@autoreleasepool {
return UIApplicationMain(argc,argv, nil,NSStringFromClass([TCAppDelegateclass****]));
}
這里傳入了代理類到UIApplicationMain函數(shù)中喻旷,UIApplicationMain函數(shù)在生成唯一個(gè)UIApplication的時(shí)候就可以把代理類的實(shí)例指針告訴這個(gè)單例對(duì)象了牢屋。
可以通過(guò)如下代碼獲UIApplication代理對(duì)象:

TCAppDelegate *myDelegate =(TCAppDelegate *)[UIApplication sharedApplication].delegate;

UIApplication接收到系統(tǒng)事件和生命周期事件時(shí)烙无,會(huì)把相應(yīng)的事件傳遞給UIApplicationDelegate進(jìn)行處理,下表所列的生命周期函數(shù)大都是可選的皱炉,但為了應(yīng)用程序的健壯性程序員應(yīng)該實(shí)現(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

說(shuō)明:當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行康铭,在此期間从藤,應(yīng)用程序不接收消息或事件,比如來(lái)電話了

2懊蒸、- (void)applicationDidBecomeActive:(UIApplication*)application

說(shuō)明:當(dāng)應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行悯搔,這個(gè)剛好跟上面那個(gè)方法相反

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

說(shuō)明:當(dāng)程序被推送到后臺(tái)的時(shí)候調(diào)用通危。所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行灌曙,則在這個(gè)函數(shù)里面設(shè)置即可

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

說(shuō)明:當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用,這個(gè)剛好跟上面的那個(gè)方法相反忍燥。

5隙姿、- (void)applicationWillTerminate:(UIApplication *)application

說(shuō)明:當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用输玷,通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作靡馁。這個(gè)需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。

6赔嚎、- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application

說(shuō)明:iPhone設(shè)備只有有限的內(nèi)存,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會(huì)終止應(yīng)用程序的運(yùn)行侠畔,在終止前會(huì)執(zhí)行這個(gè)方法损晤,通秤妊可以在這里進(jìn)行內(nèi)存清理工作防止程序被終止

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

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

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

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

9暖哨、- (void)application:(UIApplication)applicationwillChangeStatusBarFrame:(CGRect)newStatusBarFrame

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

10鹿蜀、- (void)application:(UIApplication*)applicationwillChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration

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

11、- (BOOL)application:(UIApplication)applicationhandleOpenURL:(NSURL)url

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

12颠焦、- (void)application:(UIApplication*)applicationdidChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation

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

13往枣、- (void)application:(UIApplication*)applicationdidChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame

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

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

另外一個(gè)非常重要的方法就是applicationDidReceiveMemoryWarning()功咒,因?yàn)閕Phone設(shè)備只有有限的內(nèi)存,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會(huì)終止應(yīng)用程序的運(yùn)行榜旦,但在終止之前操作系統(tǒng)會(huì)通過(guò)先調(diào)用委托類的applicationDidReceiveMemoryWarning()方法警告應(yīng)用程序景殷,在UIApplication接收到這個(gè)事件后它會(huì)傳遞給委托類的applicationDidReceiveMemoryWarning()方法猿挚,委托類在這個(gè)方法內(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)啟動(dòng)應(yīng)用程序办绝。step 2,就會(huì)進(jìn)入 UIApplicationDelegate 的- (void)applicationDidFinishLaunching:(UIApplication *)application;或 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;step 3, 如果是從 url 啟動(dòng)的則先進(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),這時(shí)應(yīng)用程序已經(jīng)是活動(dò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)用程序被中斷(如來(lái)電,來(lái)短信)博杖,進(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)閉莺匠。
下面是這個(gè)類的一些功能:

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

//設(shè)置主界面icon上的數(shù)字圖標(biāo)趣竣,在2.0中引進(jìn), 缺省為0
[UIApplicationsharedApplication].applicationIconBadgeNumber =4;
2.設(shè)置搖動(dòng)手勢(shì)的時(shí)候卫袒,是否支持redo,undo操作

//搖動(dòng)手勢(shì)夕凝,是否支持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;
慎重使用本功能,因?yàn)榉浅:碾姟?br> 5.顯示聯(lián)網(wǎng)狀態(tài)

//顯示聯(lián)網(wǎng)標(biāo)記 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;

6.在map上顯示一個(gè)地址
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.打電話到一個(gè)號(hào)碼

// Call Google 411
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];

9.發(fā)送短信
// Text to Google SMS
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

10.打開(kāi)一個(gè)網(wǎng)址

// Lanuch any iPhone developers favsite
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末模捂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子综看,更是在濱河造成了極大的恐慌岖食,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件析珊,死亡現(xiàn)場(chǎng)離奇詭異忠寻,居然都是意外死亡存和,警方通過(guò)查閱死者的電腦和手機(jī)捐腿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門茄袖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寺鸥,你說(shuō)我怎么就攤上這事品山。” “怎么了笆载?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵凉驻,是天一觀的道長(zhǎng)复罐。 經(jīng)常有香客問(wèn)我效诅,道長(zhǎng),這世上最難降的妖魔是什么咽笼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任剑刑,我火速辦了婚禮双肤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘七芭。我一直安慰自己限匣,他們只是感情好米死,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布峦筒。 她就那樣靜靜地躺著,像睡著了一般卤材。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上术吗,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天较屿,我揣著相機(jī)與錄音卓练,去河邊找鬼。 笑死嘱么,一個(gè)胖子當(dāng)著我的面吹牛顽悼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拴测,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼集索,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汇跨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起函匕,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盅惜,失蹤者是張志新(化名)和其女友劉穎忌穿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屈芜,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井佑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年躬翁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姆另。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖明吩,靈堂內(nèi)的尸體忽然破棺而出殷费,到底是詐尸還是另有隱情印荔,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布详羡,位于F島的核電站仍律,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏实柠。R本人自食惡果不足惜水泉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窒盐。 院中可真熱鬧草则,春花似錦、人聲如沸蟹漓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)份殿。三九已至,卻和暖如春嗽交,著一層夾襖步出監(jiān)牢的瞬間卿嘲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工轮纫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腔寡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓掌唾,卻偏偏與公主長(zhǎng)得像放前,于是被迫代替她去往敵國(guó)和親忿磅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容