1. 程式人生 > >iOS開發 - 不進入待機(屏幕保持喚醒)---UIApplication學習

iOS開發 - 不進入待機(屏幕保持喚醒)---UIApplication學習

功能 work 重要 list ssh end 鎖屏 消息分發 idc

假設你不希望應用執行時 iPhone 進入鎖屏待機狀態。增加以下這行代碼就可以


[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
順便, 學習了下 UIApplication。


iPhone應用程序是由主函數main啟動,它負責調用UIApplicationMain函數,該函數的形式例如以下所看到的:
對準UIApplicationMain, option+鼠標點擊。 就可以查看。
技術分享

那麽UIApplicationMain函數究竟做了哪些事情呢?這個函數主要負責三件 事情:

1)從給定的類名初始化應用程序對象。也就是初始化UIApplication或者子類對象的一個實例,假設你在這裏給定的是nil,那麽 系統會默認UIApplication類,也就主要是這個類來控制以及協調應用程序的執行。

在興許的工作中,你能夠用靜態方法sharedApplication 來獲取應用程序的句柄。

2)從給定的應用程序托付類。初始化一個應用程序托付。並把該托付設置為應用程序的托付,這裏就有假設傳入參數為nil,會調用函數訪問 Info.plist文件來尋找主nib文件。獲取應用程序托付。



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


上面是UIApplicationMain函數的工作。接下來一個問題是應用程序視圖的顯示、消息的控制怎麽辦?以下就是UIApplication(或 者子類)對象的職責。這個對象主要做以下幾件事:

1)負責處理到來的用戶事件,並分發事件消息到應該處理該消息的目標對象(sender, action)。
2)管理以及控制視圖。包含呈現、控制行為、當前顯示視圖等。


3)該對象有一個應用程序托付對象。當一些生命周期內重要事件(能夠包含系統事件或者生命周期控制事件)發生時。應用程序通知該對象。

比如,應用程序啟 動、內存不夠了或者應用程序結束等,讓這些事件發生時,應用程序托付去響應。



通 過上面的分析,能夠知道UIApplication對開發人員來說,是一個黑箱,它也能夠是。由於全部的操作,都能夠由它的托付來幫我們完畢。它僅僅須要在 後面維護一些不可更改的東西。如事件消息分發和傳遞、給托付發送事件處理請求等等,如,應用程序載入處理完畢。它會發送消息給托付,然後托付能夠在 applicationDidFinishLanching托付函數中去實現開發人員想要的動作。利用XCODE在創建應用程序時,會默認實現一個應用程序 托付類。而對於載入的視圖。則有視圖相關的托付類來處理視圖載入過程的生命事件。

以下說明托付主要能夠辦哪些事情:


控制應用程序的行為 1、- (void)applicationWillResignActive:(UIApplication *)application說明:當應用程序將要入非活動狀態執行,在此期間。應用程序不接收消息或事件。比方來電話了2、- (void)applicationDidBecomeActive:(UIApplication *)application說明:當應用程序入活動狀態執行,這個剛好跟上面那個方法相反3、- (void)applicationDidEnterBackground:(UIApplication *)application說明:當程序被推送到後臺的時候調用。所以要設置後臺繼續執行,則在這個函數裏面設置就可以4、- (void)applicationWillEnterForeground:(UIApplication *)application說明:當程序從後臺將要又一次回到前臺時候調用,這個剛好跟上面的那個方法相反。

5、- (void)applicationWillTerminate:(UIApplication *)application說明:當程序將要退出是被調用,一般是用來保存數據和一些退出前的清理工作。這個須要要設置UIApplicationExitsOnSuspend的鍵值。

6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application說明:iPhone設備僅僅有有限的內存,假設為應用程序分配了太多內存操作系統會終止應用程序的執行,在終止前會執行這種方法。通常能夠在這裏進行內存清理工作防止程序被終止7、- (void)applicationSignificantTimeChange:(UIApplication*)application說明:當系統時間發生改變時執行8、- (void)applicationDidFinishLaunching:(UIApplication*)application說明:當程序載入後執行9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame說明:當StatusBar框將要變化時執行10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientationduration:(NSTimeInterval)duration說明:當StatusBar框方向將要變化時執行11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url說明:當通過url執行12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation說明:當StatusBar框方向變化完畢後執行13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame說明:當StatusBar框變化完畢後執行
iPhone中的應用程序非常easy受到打攪,比方一個來電可能導致應用程序失去焦點,假設這個時候接聽了電話,那麽應用程序會轉到後臺執行。

還有非常多 其他相似的事件會導致iPhone應用程序失去焦點,在應用程序失去焦點前會調用托付類的applicationWillResignActive()方 法,而應用程序再次獲取到焦點的時候會調用applicationDidBecomeActive()方法。

比方在執行應用程序的時候鎖屏會調用托付類的 applicationWillResignActive()方法。而當屏幕被解鎖的時候。又會調用 applicationDidBecomeActive()方法。


另外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),由於iPhone設備僅僅有有限的內存。如 果為應用程序分配了太多內存操作系統會終止應用程序的執行。但在終止之前操作系統會通過先調用托付類的 applicationDidReceiveMemoryWarning()方法警告應用程序。在UIApplication接收到這個事件後它會傳遞給 托付類的applicationDidReceiveMemoryWarning()方法,托付類在這種方法內能夠進行釋放內存的操作以防止操作系統強制 終止應用程序的執行。
以下是這個類的一些功能:1.設置icon上的數字圖標 //設置主界面icon上的數字圖標,在2.0中引進。 缺省為0 [UIApplication sharedApplication].applicationIconBadgeNumber = 4;2.設置搖動手勢的時候,是否支持redo,undo操作 //搖動手勢,是否支持redo undo操作。 //3.0以後引進,缺省YES [UIApplication sharedApplication].applicationSupportsShakeToEdit =YES;3.推斷程序執行狀態 //推斷程序執行狀態。在2.0以後引入 /* UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground */ if([UIApplication sharedApplication].applicationState ==UIApplicationStateInactive){ NSLog(@"程序在執行狀態"); }4.阻止屏幕變暗進入休眠狀態 //阻止屏幕變暗。謹慎使用,缺省為no 2.0 [UIApplication sharedApplication].idleTimerDisabled =YES;謹慎使用本功能,由於非常耗電。5.顯示聯網狀態 //顯示聯網標記 2.0 [UIApplication sharedApplication].networkActivityIndicatorVisible =YES;6.在map上顯示一個地址 NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014"; // URL encode the spaces addressText = [addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", addressText]; [[UIApplication sharedApplication]openURL:[NSURLURLWithString:urlText]];7.發送電子郵件 NSString *recipients =@"mailto:[email protected][email protected],[email protected]&subject=Hello from California!"; NSString *body =@"&body=It is raining in sunny California!"; NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body]; email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication]openURL:[NSURLURLWithString:email]];8.打電話到一個號碼 // Call Google 411 [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];9.發送短信 // Text to Google SMS [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];10.打開一個網址 // Lanuch any iPhone developers fav site [[UIApplication sharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

iOS開發 - 不進入待機(屏幕保持喚醒)---UIApplication學習