( ̄ ︶  ̄)↗從老博客里搬過來的
一醉箕、程序啟動UIApplicationMain
UIApplication
的基類是UIResponder
了罪,和4.2以前生成的工程是不同的搏熄,以前是繼承自NSObject
惭载。
main
函數(shù)中執(zhí)行了一個UIApplicationMain
這個函數(shù)
int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName);
argc
恋拷、argv
:
直接傳遞給UIApplicationMain
進行相關(guān)處理即可
principalClassName
:
指定應(yīng)用程序類名(app的象征),該類必須是UIApplication
(或子類)王污。如果為nil,則用UIApplication
類作為默認值
delegateClassName
:
指定應(yīng)用程序的代理類罢吃,該類必須遵守UIApplicationDelegate
協(xié)議
1.UIApplicationMain
函數(shù)會根據(jù)principalClassName
創(chuàng)建UIApplication
對象
2.根據(jù)delegateClassName
創(chuàng)建一個delegate
對象 ,并將該delegate
對象賦值給UIApplication
對象中的delegate
屬性.
3.接著會建立應(yīng)用程序的Main Runloop
(事件循環(huán)),進行事件的處理(首先會在程序完畢后調(diào)用delegate
對象的application:didFinishLaunchingWithOptions:
方法)
4.程序正常退出時UIApplicationMain
函數(shù)才返回
二昭齐、UIApplication
1.簡單介紹
iOS程序啟動后創(chuàng)建的第一個對象就是UIApplication
對象,一個UIApplication
對象就代表一個應(yīng)用程序.
每個應(yīng)用都有自己的UIApplication對象
,且是單例.如果試圖在程序中新建一個UIApplication
對象,那么將提示報錯
通過[UIApplication sharedApplication]
可以獲得這個單例對象.利用UIApplication
對象尿招,能進行一些應(yīng)用級別的操作.
UIApplication
的核心作用是提供iOS程序運行期間的控制和協(xié)作工作。
在程序開始運行的時候,UIApplicationMain
函數(shù)就是程序進入點阱驾,這個函數(shù)做了很多工作,其中一個重要的工作就是創(chuàng)建一個UIApplication
的單例實例.
UIApplication
的一個主要工作是處理用戶事件,它會起一個隊列,把所有用戶事件都放入隊列,逐個處理,在處理的時候,它會發(fā)送當前事件到一個合適的處理事件的目標控件.此外UIApplication
實例還維護一個在本應(yīng)用中打開的window
列表(UIWindow
實例),這樣它就可以接觸應(yīng)用中的任何一個UIView
對象.
UIApplication
實例會被賦予一個代理對象就谜,以處理應(yīng)用程序的生命周期事件(比如程序啟動和關(guān)閉)、系統(tǒng)事件(比如來電里覆、記事項警告)等等丧荐。
2.應(yīng)用級別的操作示例
(1)設(shè)置應(yīng)用程序圖標右上角的紅色提醒數(shù)字(如QQ消息的時候,圖標上面會顯示1,2,3條新信息等喧枷。) //0表示隱藏 [UIApplication sharedApplication].applicationIconBadgeNumber = 4;
這里還有個功能就是清除本地通知
看作者的意思篮奄,應(yīng)該是他經(jīng)常收到N多通知,而通過其中一條通知打開一個app以后割去,發(fā)現(xiàn)那個app的其它通知還在通知中心窟却。作者不喜歡這樣的情況。我以為我也存在的這樣的情況呻逆,馬上檢查了一下夸赫,
發(fā)現(xiàn)沒有】С牵看來是少數(shù)app的問題茬腿。但是也記錄一下。作者總結(jié)的從通知中心移除通知的三種方法:
1.將app的BadgeNumber設(shè)為0宜雀,就是app圖標右上角那個
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
2.如果BadgeNumber本身就是0的情況切平,可以先將其設(shè)1再設(shè)置成0
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
3.如果以上的辦法都不好使的話,那就用本地通知欺騙一下辐董。
UIApplication* application = [UIApplication sharedApplication];
NSArray* scheduledNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications];
application.scheduledLocalNotifications = scheduledNotifications;
(2)設(shè)置聯(lián)網(wǎng)指示器的可見性 [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
(3)管理狀態(tài)欄 從iOS7開始悴品,系統(tǒng)提供了2種管理狀態(tài)欄的方式 info.plist
文件中,View controller-based status bar appearance
項設(shè)為YES
简烘,則View controller
對status bar
的設(shè)置優(yōu)先級高于application
的設(shè)置苔严。 為NO則以application
的設(shè)置為準,view controller
的prefersStatusBarHidden
方法無效,是根本不會被調(diào)用的孤澎。
(4)UIApplication
有個功能十分強大的openURL:
方法
UIApplication *app = [UIApplication sharedApplication];
打電話
[app openURL:[NSURLURLWithString:@"tel://10086"]];
發(fā)短信
[app openURL:[NSURLURLWithString:@"sms://10086"]];
發(fā)郵件
[app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
打開網(wǎng)頁
[app openURL:[NSURLURLWithString:@"http://ios.cn"]];
跳轉(zhuǎn)到設(shè)置頁面的對應(yīng)項:
//比如打開wifi [app openURL:[NSURL URLWithString:@"prefs:root=WIFI"]]; About — prefs:root=General&path=About Accessibility — prefs:root=General&path=ACCESSIBILITY Airplane Mode On — prefs:root=AIRPLANE_MODE Auto-Lock — prefs:root=General&path=AUTOLOCK Brightness — prefs:root=Brightness Bluetooth — prefs:root=General&path=Bluetooth Date & Time — prefs:root=General&path=DATE_AND_TIME FaceTime — prefs:root=FACETIME General — prefs:root=General Keyboard — prefs:root=General&path=Keyboard iCloud — prefs:root=CASTLE iCloud Storage & Backup — prefs:root=CASTLE&path=STORAGE_AND_BACKUP International — prefs:root=General&path=INTERNATIONAL Location Services — prefs:root=LOCATION_SERVICES Music — prefs:root=MUSIC Music Equalizer — prefs:root=MUSIC&path=EQ Music Volume Limit — prefs:root=MUSIC&path=VolumeLimit Network — prefs:root=General&path=Network Nike + iPod — prefs:root=NIKE_PLUS_IPOD Notes — prefs:root=NOTES Notification — prefs:root=NOTIFICATIONS_ID Phone — prefs:root=Phone Photos — prefs:root=Photos Profile — prefs:root=General&path=ManagedConfigurationList Reset — prefs:root=General&path=Reset Safari — prefs:root=Safari Siri — prefs:root=General&path=Assistant Sounds — prefs:root=Sounds Software Update — prefs:root=General&path=SOFTWARE_UPDATE_LINK Store — prefs:root=STORE Twitter — prefs:root=TWITTER Usage — prefs:root=General&path=USAGE VPN — prefs:root=General&path=Network/VPN Wallpaper — prefs:root=Wallpaper Wi-Fi — prefs:root=WIFI
openURL
方法,可以打開其他APP
要用到 URL Scheme
(5)設(shè)置搖動手勢的時候,是否支持redo,undo操作 3.0以后引進,默認YES
[UIApplication sharedApplication].applicationSupportsShakeToEdit =YES;
(6)判斷程序運行狀態(tài) 在2.0以后引入
UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground
if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){ NSLog(@"程序在運行狀態(tài)"); }
(7)阻止屏幕變暗進入休眠狀態(tài) ,耗電,慎重默認NO
[UIApplicationsharedApplication].idleTimerDisabled =YES;
(8)在map上顯示一個地址
NSString addressText = @"1 Infinite Loop, Cupertino, CA 95014";
addressText = [addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSString urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];
[[UIApplication sharedApplication]openURL:[NSURLURLWithString:urlText]];
三届氢、UIApplication Delegate
UIApplication
接收到所有的系統(tǒng)事件和生命周期事件時,都會把事件傳遞給UIApplicationDelegate
進行處理,對于用戶輸入事件,則傳遞給相應(yīng)的目標對象去處理.比如我們在應(yīng)用程序被來電等消息后,可以調(diào)用應(yīng)用程序委托類的applicationWillResignActive()
方法,這個方法在用戶鎖住屏幕時,也會調(diào)用.與之相適應(yīng)的是應(yīng)用程序重新被用戶打開時的委托方法.另外常用的就是內(nèi)存不足的系統(tǒng)警告,此時會調(diào)用應(yīng)用程序委托類的applicationDidReceiveMemoryWarning()
方法, 然后我們就可以試著釋放一些內(nèi)存了.
UIApplication對象實例化后,程序啟動時首先會調(diào)用該方法覆旭。
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
1退子、- (void)applicationWillResignActive:(UIApplication *)application
說明:通知委托應(yīng)用程序?qū)⒁M入非活動狀態(tài)執(zhí)行岖妄,在此期間,應(yīng)用程序不接收消息或事件寂祥,比如來電話了衣吠、鎖屏等。
2壤靶、- (void)applicationDidBecomeActive:(UIApplication *)application
說明:當應(yīng)用程序入活動狀態(tài)執(zhí)行缚俏,請恢復(fù)數(shù)據(jù),這個剛好跟上面那個方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application
說明:當程序被推送到后臺的時候調(diào)用贮乳。所以要設(shè)置后臺繼續(xù)運行忧换,則在這個函數(shù)里面設(shè)置即可
4、- (void)applicationWillEnterForeground:(UIApplication *)application
說明:當程序從后臺將要重新回到前臺時候調(diào)用向拆,這個剛好跟上面的那個方法相反亚茬。
5、- (void)applicationWillTerminate:(UIApplication *)application
說明:當程序?qū)⒁顺鰰r被調(diào)用浓恳,通常是用來保存數(shù)據(jù)和一些退出前的清理工作刹缝。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
6颈将、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
說明:iPhone設(shè)備只有有限的內(nèi)存梢夯,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會終止應(yīng)用程序的運行,在終止前會執(zhí)行這個方法晴圾,通乘淘遥可以在這里進行內(nèi)存清理工作防止程序被終止
7、- (void)applicationSignificantTimeChange:(UIApplication*)application
說明:當系統(tǒng)時間發(fā)生改變時執(zhí)行(主要是指時間屬性死姚,而不是具體的時間值)
8人乓、- (void)applicationDidFinishLaunching:(UIApplication*)application
說明:當程序載入后執(zhí)行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
說明:當StatusBar框?qū)⒁兓瘯r執(zhí)行
10都毒、- (void)application:(UIApplication*)application willChangeStatusBarOrientation: (UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration
說明:當StatusBar框方向?qū)⒁兓瘯r執(zhí)行色罚,控制狀態(tài)欄方位變化
11、- (BOOL)application:(UIApplication)application handleOpenURL:(NSURL)url
說明:當通過url執(zhí)行账劲,打開指定的URL
12戳护、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
說明:當StatusBar框方向變化完成后執(zhí)行,設(shè)備方向?qū)⒁l(fā)生改變
13涤垫、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
說明:當StatusBar框變化完成后執(zhí)行
14姑尺、- (BOOL) application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
15竟终、- (void) application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder
16蝠猬、- (void) application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder
iPhone中的應(yīng)用程序很容易受到打擾,比如一個來電可能導(dǎo)致應(yīng)用程序失去焦點统捶,如果這個時候接聽了電話榆芦,那么應(yīng)用程序會轉(zhuǎn)到后臺運行柄粹。還有很多 其它類似的事件會導(dǎo)致iPhone應(yīng)用程序失去焦點,在應(yīng)用程序失去焦點前會調(diào)用委托類的applicationWillResignActive()
方 法匆绣,而應(yīng)用程序再次獲取到焦點的時候會調(diào)用applicationDidBecomeActive()
方法驻右。比如在運行應(yīng)用程序的時候鎖屏?xí){(diào)用委托類的 applicationWillResignActive()
方法,而當屏幕被解鎖的時候崎淳,又會調(diào)用 applicationDidBecomeActive()
方法堪夭。
另外一個非常重要的方法就是applicationDidReceiveMemoryWarning()
,因為iPhone設(shè)備只有有限的內(nèi)存拣凹,如果為應(yīng)用程序分配了太多內(nèi)存操作系統(tǒng)會終止應(yīng)用程序的運行森爽,但在終止之前操作系統(tǒng)會通過先調(diào)用委托類的 applicationDidReceiveMemoryWarning()
方法警告應(yīng)用程序,在UIApplication
接收到這個事件后它會傳遞給 委托類的applicationDidReceiveMemoryWarning()
方法嚣镜,委托類在這個方法內(nèi)可以進行釋放內(nèi)存的操作以防止操作系統(tǒng)強制 終止應(yīng)用程序的運行爬迟。