( ̄ ︶  ̄)↗從老博客里搬過來的
一、程序啟動UIApplicationMain
UIApplication的基類是UIResponder,和4.2以前生成的工程是不同的,以前是繼承自NSObject。
main函數(shù)中執(zhí)行了一個UIApplicationMain這個函數(shù)
int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName);
argc、argv:
直接傳遞給UIApplicationMain進行相關處理即可
principalClassName:
指定應用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值
delegateClassName:
指定應用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議
1.UIApplicationMain函數(shù)會根據(jù)principalClassName創(chuàng)建UIApplication對象
2.根據(jù)delegateClassName創(chuàng)建一個delegate對象 ,并將該delegate對象賦值給UIApplication對象中的delegate屬性.
3.接著會建立應用程序的Main Runloop(事件循環(huán)),進行事件的處理(首先會在程序完畢后調用delegate對象的application:didFinishLaunchingWithOptions:方法)
4.程序正常退出時UIApplicationMain函數(shù)才返回
二、UIApplication
1.簡單介紹
iOS程序啟動后創(chuàng)建的第一個對象就是UIApplication對象,一個UIApplication對象就代表一個應用程序.
每個應用都有自己的UIApplication對象,且是單例.如果試圖在程序中新建一個UIApplication對象,那么將提示報錯
通過[UIApplication sharedApplication]可以獲得這個單例對象.利用UIApplication對象,能進行一些應用級別的操作.
UIApplication的核心作用是提供iOS程序運行期間的控制和協(xié)作工作。
在程序開始運行的時候,UIApplicationMain函數(shù)就是程序進入點,這個函數(shù)做了很多工作,其中一個重要的工作就是創(chuàng)建一個UIApplication的單例實例.
UIApplication的一個主要工作是處理用戶事件,它會起一個隊列,把所有用戶事件都放入隊列,逐個處理,在處理的時候,它會發(fā)送當前事件到一個合適的處理事件的目標控件.此外UIApplication實例還維護一個在本應用中打開的window列表(UIWindow實例),這樣它就可以接觸應用中的任何一個UIView對象.
UIApplication實例會被賦予一個代理對象,以處理應用程序的生命周期事件(比如程序啟動和關閉)、系統(tǒng)事件(比如來電、記事項警告)等等。
2.應用級別的操作示例
(1)設置應用程序圖標右上角的紅色提醒數(shù)字(如QQ消息的時候,圖標上面會顯示1,2,3條新信息等。) //0表示隱藏 [UIApplication sharedApplication].applicationIconBadgeNumber = 4;
這里還有個功能就是清除本地通知
看作者的意思,應該是他經(jīng)常收到N多通知,而通過其中一條通知打開一個app以后,發(fā)現(xiàn)那個app的其它通知還在通知中心。作者不喜歡這樣的情況。我以為我也存在的這樣的情況,馬上檢查了一下,
發(fā)現(xiàn)沒有??磥硎巧贁?shù)app的問題。但是也記錄一下。作者總結的從通知中心移除通知的三種方法:
1.將app的BadgeNumber設為0,就是app圖標右上角那個
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
2.如果BadgeNumber本身就是0的情況,可以先將其設1再設置成0
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
3.如果以上的辦法都不好使的話,那就用本地通知欺騙一下。
UIApplication* application = [UIApplication sharedApplication];
NSArray* scheduledNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications];
application.scheduledLocalNotifications = scheduledNotifications;
(2)設置聯(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項設為YES,則View controller對status bar的設置優(yōu)先級高于application的設置。 為NO則以application的設置為準,view controller的prefersStatusBarHidden方法無效,是根本不會被調用的。
(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"]];
跳轉到設置頁面的對應項:
//比如打開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)設置搖動手勢的時候,是否支持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進行處理,對于用戶輸入事件,則傳遞給相應的目標對象去處理.比如我們在應用程序被來電等消息后,可以調用應用程序委托類的applicationWillResignActive()方法,這個方法在用戶鎖住屏幕時,也會調用.與之相適應的是應用程序重新被用戶打開時的委托方法.另外常用的就是內存不足的系統(tǒng)警告,此時會調用應用程序委托類的applicationDidReceiveMemoryWarning()方法, 然后我們就可以試著釋放一些內存了.
UIApplication對象實例化后,程序啟動時首先會調用該方法。
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
1、- (void)applicationWillResignActive:(UIApplication *)application
說明:通知委托應用程序將要進入非活動狀態(tài)執(zhí)行,在此期間,應用程序不接收消息或事件,比如來電話了、鎖屏等。
2、- (void)applicationDidBecomeActive:(UIApplication *)application
說明:當應用程序入活動狀態(tài)執(zhí)行,請恢復數(shù)據(jù),這個剛好跟上面那個方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application
說明:當程序被推送到后臺的時候調用。所以要設置后臺繼續(xù)運行,則在這個函數(shù)里面設置即可
4、- (void)applicationWillEnterForeground:(UIApplication *)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í)行,控制狀態(tài)欄方位變化
11、- (BOOL)application:(UIApplication)application handleOpenURL:(NSURL)url
說明:當通過url執(zhí)行,打開指定的URL
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
說明:當StatusBar框方向變化完成后執(zhí)行,設備方向將要發(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中的應用程序很容易受到打擾,比如一個來電可能導致應用程序失去焦點,如果這個時候接聽了電話,那么應用程序會轉到后臺運行。還有很多 其它類似的事件會導致iPhone應用程序失去焦點,在應用程序失去焦點前會調用委托類的applicationWillResignActive()方 法,而應用程序再次獲取到焦點的時候會調用applicationDidBecomeActive()方法。比如在運行應用程序的時候鎖屏會調用委托類的 applicationWillResignActive()方法,而當屏幕被解鎖的時候,又會調用 applicationDidBecomeActive()方法。
另外一個非常重要的方法就是applicationDidReceiveMemoryWarning(),因為iPhone設備只有有限的內存,如果為應用程序分配了太多內存操作系統(tǒng)會終止應用程序的運行,但在終止之前操作系統(tǒng)會通過先調用委托類的 applicationDidReceiveMemoryWarning()方法警告應用程序,在UIApplication接收到這個事件后它會傳遞給 委托類的applicationDidReceiveMemoryWarning()方法,委托類在這個方法內可以進行釋放內存的操作以防止操作系統(tǒng)強制 終止應用程序的運行。
