UIApplication 生命周期、作用棠绘、功能

UIApplication作用
UIApplication的核心作用是提供了iOS程序運行期間的控制和協(xié)作工作。
每一個程序在運行期必須有且僅有一個UIApplication(或則其子類)的一個實例再扭。在程序開始運行的時候氧苍,UIApplicationMain函數(shù)是程序進入點,這個函數(shù)做了很多工作泛范,其中一個重要的工作就是創(chuàng)建一個UIApplication的單例實例让虐。在你的代碼中,你可以通過調用[UIApplication sharedApplication]來得到這個單例實例的指針罢荡。
UIApplication的一個主要工作是處理用戶事件赡突,它會維護一個隊列,把所有用戶事件都放入隊列柠傍,逐個處理麸俘,在處理的時候辩稽,它會發(fā)送當前事件到一個合適的處理事件的目標控件惧笛。此外,UIApplication實例還維護一個本應用中打開的window列表(UIWindow實例)逞泄,這樣它就可以接觸應用中的任何一個UIView對象患整。UIApplication實例會被賦予一個代理對象拜效,以處理應用程序的生命周期事件(比如程序啟動和關閉)、系統(tǒng)事件(比如來電各谚、記事項警告)等等紧憾。


啟動原理

1.在main.m的main函數(shù)中執(zhí)行了UIApplicationMain這個方法,這是iOS程序的入口點
2.intUIApplicationMain(intargc,char*argv[], NSString *principalClassName, NSString *delegateClassName) 
 argc昌渤、argv:ISO C標準main函數(shù)的參數(shù),直接傳遞 給UIApplicationMain進行相關處理即可 
3.principalClassName:指定應用程序類赴穗,該類必須是UIApplication(或子類)。如果為nil膀息,則用UIApplication類作為默認值
4.delegateClassName:指定應用程序類的代理類般眉,該類必須遵守UIApplicationDelegate協(xié)議
5.UIApplicationMain函數(shù)會根據(jù)principalClassName創(chuàng)建UIApplication對象,根據(jù)delegaClassName創(chuàng)建一個delegate對象潜支,并將該delegate對象賦值給UIApplication對象中的delegate屬性甸赃。
6.UIApplication對象會依次給delegate對象發(fā)送不同的消息,接著會建立應用程序的main runloop(事件循環(huán))冗酿,進行事件的處理(首先會調用delegate對象的application:didFinishLaunchingWithOptions:)
7.如果設置了主xib文件(在Info.plist中指定埠对,key是NSMainNibFile),就會在主xib文件中尋找UIApplication和連接它的delegate裁替。因此在主xib文件中项玛,F(xiàn)ile's Owner必須為UIApplication(或其子類),并且建立一個遵守UIApplicationDelegate的delegate對象胯究,建立UIApplication和delegate對象的關聯(lián)關系
8.UIApplication試試應用程序的核心稍计,每一個程序在運行必須有UIApplication(或子類)的一個實例(有且僅有一個),通過[UIApplication sharedApplication]可以得到這個單例實例的指針
9.UIApplication幫助管理應用程序的生命周期裕循,而它通過delegate來履行這個任務
10.UIApplication可以接收事件臣嚣,把所有用戶事件都放入隊列,逐個處理剥哑,它會發(fā)送當前事件給一個合適的目標控件進行處理硅则。它還將部分事件轉給delegate對象來處理,delegate可處理的事件包括:應用程序的生命周期事件(如程序啟動和關閉)株婴、系統(tǒng)事件(如來電)
圖1.png

應用程序的狀態(tài)

iOS的應用程序一共有5種狀態(tài)怎虫。

· Not running(未運行):程序未啟動
· Inactive(未激活):其他兩個狀態(tài)切換時出現(xiàn)的短暫狀態(tài)。唯一在此狀態(tài)停留時間比較長的情況是:當用戶鎖屏時或者系統(tǒng)提示用戶去響應Alert窗口(如來電困介、信息)時
· Active(激活):在屏幕上顯示的正常運行狀態(tài)大审,該狀態(tài)下可以接收用戶輸入并更新顯示
· Background(后臺):程序在后臺且能執(zhí)行代碼。用戶按下Home鍵不久后進入此狀態(tài)(先進入了Inactive狀態(tài)座哩,再進入Background狀態(tài))徒扶,然后會迅速進入掛起狀態(tài)(Suspended)。有的程序經過特殊的請求后可以長期處于Background狀態(tài)
· Suspended(掛起):程序在后臺不能執(zhí)行代碼根穷。普通程序在進入Background狀態(tài)不久后就會進入此狀態(tài)姜骡。當掛起時导坟,程序還是停留在內存中的,當系統(tǒng)內存低時圈澈,系統(tǒng)就把掛起的程序清除掉惫周,為前臺程序提供更多的內存
圖2.png

UIApplicationDelegate的方法

在UIApplication接收到系統(tǒng)事件和生命周期事件時,會把相應的事件傳遞給UIApplicationDelegate進行處理康栈,下表所列的生命周期函數(shù)大都是可選的递递,但為了應用程序的健壯性程序員應該實現(xiàn)它們。

1啥么、 - (void)applicationWillResignActive:(UIApplication*)application
說明:當應用程序將要進入非活動狀態(tài)執(zhí)行漾狼,在此期間,應用程序不接收消息或事件饥臂,比如來電話了逊躁。
2、-(void)applicationDidBecomeActive:(UIApplication *)application
說明:當應用程序進入活動狀態(tài)執(zhí)行隅熙,這個剛好和上面的那個方法相反
3稽煤、-(void)applicationDidEnterBackground:(UIApplication*)application
說明:當程序被推送到后臺的時候調用。所以要設置后臺繼續(xù)運行囚戚,則在這個函數(shù)里面設置即可酵熙。
4、 -(void)applicationWillEnterForeground:(UIAppliaction*)application
說明:當程序從后臺將要重新回到前臺時候調用驰坊,這個剛好跟上面的那個方法相反匾二。
5、 -(void)applicationWillTerminate:(UIApplication *)application
說明:當程序將要退出時調用拳芙,通常是用來保存數(shù)據(jù)和一些推出前的清理工作。這個需要設置UIApplicationExitsOnSuspend的鍵值舟扎。
6、 -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
說明:iPhone設置只有有限的內存睹限,如果為應用程序分配了太多的內存操作系統(tǒng)會終止應用程序的運行譬猫,在終止前會執(zhí)行這個方法羡疗,通常可以在這里進行內存清理工作防止程序被終止
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午乓、 -(void)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應用程序失去焦
點摸袁,在應用程序失去焦點前會調用委托類的applicationWillResignAction()方法钥顽,而應用程
序再次獲取到焦點的時候會調用applicationDidBecomeActive()方法。比如在運行應用程序的
時候鎖屏會調用委托類的applicationWillResignActive()方法靠汁,而當屏幕被解鎖的時候蜂大,又
會調用applicationDidBecomeActive()方法。

另外一個非常重要的方法就是applicationDidReceiveMemoryWarning()蝶怔,因為iPhone設備
只有有限的內存奶浦,如果為應用程序分配了太多內存操作系統(tǒng)會終止應用程序的運行,但在終止之前操
作系統(tǒng)會通過先調用委托類的applicationDidReceiveMemoryWarning()方法警告應用程序踢星,
在UIApplication接收到這個事件后它會傳遞給委托類的
applicationDidReceiveMemoryWarning()方法澳叉,委托類在這個方法內可以進行釋放內存的操
作以防止操作系統(tǒng)強制終止應用程序的運行。

UIApplication的周期關鍵性步驟:

step 1:點擊app icon或者從應用程序url(比如是Safari地址欄中輸入應用程序url)啟動應用程序
step 2:就會進入UIApplicationDelegate的
-(void)applicationDidFinishLaunching:(UIApplication*)application或
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

step 3:如果是從url啟動的則進入UIApplicationDelegate的
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
然后在跳轉到step 4沐悦;否則直接跳轉都step 4
step 4:進入UIApplicationDelegate的-(void)applicationDidBecomeActive:(UIApplication *)application
step 5:進入應用程序主循環(huán)成洗,這時應用程序已經是活動的了,用戶可以與應用程序交互藏否。
step 6:在step 5狀態(tài)下泌枪,如果按住home鍵或者進行任務切換操作,然后跳轉到step 8秕岛;
step 7:在step 5狀態(tài)下碌燕,應用程序被中斷(如來電,來短信)继薛,進入UIApplicationDelegate
的-(void)applicationWillResignActive:(UIApplication *)application
如果用戶選擇不處理繼續(xù)留在當前應用程序修壕,則回到step 4;如果用戶選擇處理遏考,則跳轉到step8慈鸠。
step 8:進入UIApplicationDelegate的
-(void)applicationWillTerminate:(UIApplication *)application;
當前應用程序關閉

UIApplication類的一些功能

1.設置icon上的數(shù)字圖標
// 設置主界面icon上的數(shù)字圖標灌具,在2.0中引進青团,缺省為0
[UIApplication sharedApplication].applicationIconBadgeNumber  = 4;
2.設置搖動手勢的時候譬巫,是否支持redoundo操作。
// 3.0以后引進督笆,缺省YES
[UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
3.判斷程序運行狀態(tài)
if([UIApplication sharedApplication].applicationState == UIApplicationStateInactive){
    NSLog(@"程序正在運行狀態(tài)")芦昔;
}
4.阻止屏幕變暗進入休眠狀態(tài)
// 阻止屏幕變暗,慎重使用娃肿,缺省為NO2.0
[UIApplication sharedApplication].idleTimerDisabled  = YES;
// 慎重使用本功能咕缎,因為非常耗電
5.顯示聯(lián)網狀態(tài)
// 顯示聯(lián)網標記2.0
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
6.在map上顯示一個地址
NSString *addressText    = @"llllllllllllll";
// URL encode the spaces
addressText  = [addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString* urlText = [NSStringstringWithFormat:@”http://maps.google.com/maps?q=%@“,addressText];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: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  = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]];
8.打電話到一個號碼
// Call Google 411
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];
9.發(fā)送短信
// Text to Google SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"]];
10.打開一個網址
// Lanuch any iPhone developers favsite
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"]];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市料扰,隨后出現(xiàn)的幾起案子凭豪,更是在濱河造成了極大的恐慌,老刑警劉巖晒杈,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異末早,居然都是意外死亡说庭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門姿搜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舅柜,“玉大人致份,你說我怎么就攤上這事础拨。” “怎么了滔蝉?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵蝠引,是天一觀的道長。 經常有香客問我矫夯,道長吊洼,這世上最難降的妖魔是什么融蹂? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任超燃,我火速辦了婚禮意乓,結果婚禮上约素,老公的妹妹穿的比我還像新娘。我一直安慰自己士葫,他們只是感情好送悔,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布欠啤。 她就那樣靜靜地躺著,像睡著了一般应狱。 火紅的嫁衣襯著肌膚如雪疾呻。 梳的紋絲不亂的頭發(fā)上写半,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天污朽,我揣著相機與錄音,去河邊找鬼矾睦。 笑死,一個胖子當著我的面吹牛缓溅,可吹牛的內容都是我干的赁温。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼袜匿,長吁一口氣:“原來是場噩夢啊……” “哼居灯!你這毒婦竟也來了内狗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤岩灭,失蹤者是張志新(化名)和其女友劉穎川背,沒想到半個月后熄云,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妙真,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡珍德,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年锈候,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摄职。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔垢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鹏漆,我是刑警寧澤创泄,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布鞠抑,位于F島的核電站,受9級特大地震影響碍拆,放射性物質發(fā)生泄漏慨蓝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一弧满、第九天 我趴在偏房一處隱蔽的房頂上張望此熬。 院中可真熱鬧,春花似錦募谎、人聲如沸阴汇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哥倔。三九已至,卻和暖如春东抹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背府阀。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工试浙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人田巴。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓抄伍,卻偏偏與公主長得像管宵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子箩朴,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理炸庞,服務發(fā)現(xiàn),斷路器查牌,智...
    卡卡羅2017閱讀 134,696評論 18 139
  • iPhone應用程序是由主函數(shù)main啟動纸颜,它負責調用UIApplicationMain函數(shù),該函數(shù)的形式如下所示...
    Rickie_Lambert閱讀 1,934評論 0 2
  • 部分(15) 目錄(?)[+] UIApplication的核心作用是提供了iOS程序運行期間的控制和協(xié)作工作。每...
    wzf_taker閱讀 336評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,160評論 30 470
  • 都說孤獨的人害怕傷心浊洞,也更愿意被打動法希。 你的一句諾言靶瘸,我卻傻傻的相信了毛肋! 把自己活得太卑微...
    厭人心Y閱讀 188評論 0 0