iOS- 應用程序對象UIApplication

iphone應用程序是由主函數main啓動,它負責調用UIApplicationMain函數,該函數的形勢以下所示: ios

int UIApplicationMain ( xcode

int argc, app

char *argv[], iphone

NSString *principalClassName, 函數

NSString *delegateClassName oop

); google

 那麼UIApplicationMain函數到底作了哪些事情呢?這個函數主要負責三件事情: atom

 1)從給定的類名初始化應用程序對象,也就是初始化UIApplication或者子類對象的一個實例,若是你在這裏給定的是nil,那麼系統會默認UIApplication,也就主要是這個類來控制及協調應用程序的運行。在後續的工做中,你能夠用靜態方法sharedApplication來獲取應用程序的句柄。 url

 2)從給定的應用程序委託類,初始化一個應用程序委託。並把該委託設置爲應用程序的的委託,這裏就有若是傳入參數爲nil,會調用函數訪問info.plist文件來尋找nib文件,獲取應用程序委託。 spa

 3)啓動主事件循環,並開始接收事件。

 應用程序試圖的顯示、消息的控制怎麼辦?下面就是UIApplication類或者子類對象的職責,這個對象主要作下面幾件事:

 1)負責處理到來的用戶事件,並分發事件消息到應該處理該消息的目標對象(sender, action)

 2)管理以及控制視圖,包括呈現、控制行爲、當前顯示視圖等。

 3)該對象有一個應用程序委託對象,當一些生命週期內重要事件(能夠包括系統事件或者生命週期控制事件)發生時,應用程序通知該對象。例如,應用程序啓動、內存不夠了或者應用程序結束等,讓這些事件發生時,應用程序委託去響應。

 appldelegate通常就是應用程序的委託類吧?待驗證 11.12晚上

 經過上面的分析,能夠知道UIApplication對開發者來講,是一個黑箱,它也能夠是。由於全部的操做,均可以由它的委託來幫咱們完成,它只須要在後面維護一些不可更改的東西,如事件消息分發和傳遞、給委託發送事件處理請求等等,如,應用程序加載完畢,它會發送消息給委託,而後委託能夠在applicationDidFinishLanching委託函數中實現開發者想要的動做。利用xcode在建立應用程序時,會默認實現一個應用程序委託類。而對於加載的視圖,則有相關視圖的委託類來處理視圖加載過程的生命事件。下面說明委託主要能夠辦哪些事情:

 控制應用程序的行爲

 - (void)applicationDidFinishLaunching:(UIApplication *)application

          應用程序啓動完畢

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

          當因爲其餘方法打開應用程序(如URL指定或者鏈接),通知委託啓動完畢

 - (void)applicationWillTerminate:(UIApplication *)application

      通知委託,應用程序將在關閉退出,請作一些清理工做。

 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

     通知委託,應用程序收到了來自系統的內存不足警告

 -(void)applicationSignificantTimeChange:(UIApplication *)application 

     通知委託系統時間發生改變(主要是指時間屬性,而不是具體的時間值)

 打開URL

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

      打開指定的URL

控制狀態欄方位變化

 – application:willChangeStatusBarOrientation:duration:

 

設備方向將要發生改變

 – application:didChangeStatusBarOrientation:

活動狀態改變

 - (void)applicationWillResignActive:(UIApplication *)application

   通知委託程序進入活動狀態,請恢復數據

 

 1.設置icon上的數字圖標

 //設置主界面icon上的數字圖標,在2.0引進,缺省位0

 [UIApplicationsharedApplication].applicationIconBadgeNumber = 4;

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

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

 //3.0之後引進,缺省yes

 [UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;

 // 判斷程序運行狀態,在2.0之後引入

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

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

 }

 4.阻止屏幕進入休眠狀態

 //屏幕缺省變暗,慎重使用,缺省爲no 2.0

 [UIApplicationsharedApplication].idleTimerDisabled =YES;

 

慎重使用此功能,由於很是耗電。

 5.顯示聯網狀態

 //顯示聯網狀態 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.發送電子郵件

 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,發送短信

 // Text to Google SMS

 [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

 

10.打開一個網址

 

 // Lanuch any iphone developers fav site

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

 

能夠看到UIApplication的頭文件實現裏

 @property(nullable, nonatomic,assign) id<UIApplicationDelegate> delegate;

這就是應用程序委託

 所以,在UIApplication中處理的系統事件時,只需轉到delegate這個類去處理,這個對象就是應用程序委託對象。咱們能夠從應用程序的單🍐對象中獲得應用程序委託的對象

 UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate];

UIApplication 接收到全部的系統事件和生命週期事件時,都會把事件傳遞給UIApplicationDelegate進行處理,對於用戶輸入 事件,則傳遞給相應的目標對象去處理。好比咱們在應用程序被來電等消息後,能夠調用應用程序委託類的 applicationWillResignActive()方法,這個方法在用戶鎖住屏幕時,也會調用,與之相適應的是應用程序從新被用戶打開時的委託 方法。另外經常使用的就是內存不足的系統警告,此時會調用應用程序委託類的applicationDidReceiveMemoryWarning()方法, 而後咱們就能夠試着釋放一些內存了。

上面就是應用程序生命週期(啓動,停止,恢復,退出等過程)的應用程序處理UIApplication sharedApplication


 

 IOS應用程序生命週期

 UIViewController的生命週期

 程序的生命週期

 程序的生命週期是指應用程序啓動到應用程序結束整個 階段的全過程 每個IOS應用程序都包含一個UIApplication對象, IOS系統經過該UIApplication對象監控應用程序生命周 期全過程 每個IOS應用程序都要爲其UIApplication對象指定一 個代理對象,並由該代理對象處理UIApplication對象監 測到的應用程序生命週期事件。

 IOS應用程序5種狀態

 Not running:應用尚未啓動,或者應用正在運行可是途中被系

 統中止

 Inactive:當前應用正在前臺運行,可是並不接收事件(當前 或許

 正在執行其它代碼)。通常每當應用要從一個狀態切換到另外一個不 同的狀態時,中途過渡會短暫停留在此狀態。惟一在此狀態停留時 間比較長的狀況是:當用戶 鎖屏時,或者系統提示用戶去響應某 些(諸如電話來電、有未讀短信等)事件的時候。

 Active:當前應用正在前臺運行,而且接收事件。這是應用正在前

 臺運行時所處的正常狀態。

 Background:應用處在後臺,而且還在執行代碼。大多數將 要進

 入Suspended狀態的應用,會先短暫進入此狀態。然而,對於請求 須要額外的執行時間的應用,會在此狀態保持更長一段時間。另外, 若是一個應用要 求啓動時直接進入後臺運行,這樣的應用會直接 從Not running狀態進入Background狀態,中途不會通過Inactive狀 態。好比沒有界面的應用。注此處並不特指沒有界面的應用,其實 也能夠是 有界面的應用,只是若是要直接進入background狀態的 話,該應用界面不會被顯示。

 Suspended:應用處在後臺,而且已中止執行代碼。系統自動 的

 將應用移入此狀態,且在此舉以前不會對應用作任何通知。當處在 此狀態時,應用依然駐留內存但不執行任何程序代碼。當系統發生 低內存告警時,系統將會將處 於Suspended狀態的應用清除出內 存覺得正在前臺運行的應用提供足夠的內存。

 建立UIApplication對象並指定其代理

 經過UIApplicationMain函數建立UIApplication對象並 指定其代理對象AppDelegate;第三個參數爲指定 UIApplication的子類來生成UIApplication對象,爲nil時由 UIApplication類初始化默認對象;第四個參數爲指定代理 對象。

 UIApplication的代理對象

 做爲UIApplication的代理類,必需要先實現 UIApplicationDelegate協議,協議裏明確了做爲代理應 該作或能夠作哪些事情。 UIApplication對象負責監聽應用程序的生命週期事件, 並將生命週期事件交由UIApplication代理對象處理。

 UIApplication代理對象生命週期函數詳解

 - (void)applicationWillResignActive:(UIApplication *)application

 說明:當應用程序將要入非活動狀態執行,在此期間,應用 程

 序不接收消息或事件,好比來電話了

 - (void)applicationDidBecomeActive:(UIApplication *)application

 說明:當應用程序入活動狀態執行,這個恰好跟上面那個方 法相反

 - (void)applicationDidEnterBackground:(UIApplication *)application

 說明:當程序被推送到後臺的時候調用。因此要設置後臺繼 續運行,則在這個函數裏面設置便可

 UIApplication代理對象生命週期函數詳解

 - (void)applicationWillEnterForeground:(UIApplication *)application

 說明:當程序從後臺將要從新回到前臺時候調用,這個恰好 跟上面的那個方法相反。

 - (void)applicationWillTerminate:(UIApplication *)application

 說明:當程序將要退出是被調用,一般是用來保存數據和一 些退出前的清理工做。這個須要要設置 UIApplicationExitsOnSuspend的鍵值

 (void)applicationDidReceiveMemoryWarning:(UIApplic ation *)application

 說明:ios設備只有有限的內存,若是爲應用程序分配了太多 內存操做系統會終止應用程序的運行,在終止前會執行這個 方法,一般能夠在這裏進行內存清理工做防止程序被終止

 UIApplication代理對象生命週期函數詳解

 (void)applicationDidFinishLaunching:(UIApplication*)a pplication

 說明:當程序載入後執行。

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

 說明:當打開URL時執行。

 UIViewController

 UIViewController是IOS頂層視圖的載體及控制器,用戶 與程序界面的交互都是由UIViewController來控制的。 UIViewController管理UIView的生命週期及資源的加載 與釋放。

 UIView UIView與UIWindow共同展現了應用用戶界面。

 UIViewController生命週期事件

 -(void)loadView

 加載視圖資源並初始化視圖

 - (void)viewDidLoad - (void)viewDidUnload

 釋放視圖資源

 - (void)viewWillAppear:(BOOL)animated

 將要加載出視圖

 - (void)viewDidAppear:(BOOL)animated

 視圖出現

 - (void)viewWillDisappear:(BOOL)animated

 視圖即將消失

 (void)viewDidDisappear:(BOOL)animated

 視圖已經消失

相關文章
相關標籤/搜索