UIApplication總結(jié)Version0.6

( ̄ ︶  ̄)↗從老博客里搬過來的

一醉箕、程序啟動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 controllerstatus bar的設(shè)置優(yōu)先級高于application的設(shè)置苔严。 為NO則以application的設(shè)置為準,view controllerprefersStatusBarHidden方法無效,是根本不會被調(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)用程序的運行爬迟。

application生命周期.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菊匿,隨后出現(xiàn)的幾起案子付呕,更是在濱河造成了極大的恐慌,老刑警劉巖跌捆,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徽职,死亡現(xiàn)場離奇詭異,居然都是意外死亡佩厚,警方通過查閱死者的電腦和手機活箕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來可款,“玉大人育韩,你說我怎么就攤上這事」刖ǎ” “怎么了筋讨?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摸恍。 經(jīng)常有香客問我悉罕,道長,這世上最難降的妖魔是什么立镶? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任壁袄,我火速辦了婚禮,結(jié)果婚禮上媚媒,老公的妹妹穿的比我還像新娘嗜逻。我一直安慰自己,他們只是感情好缭召,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布栈顷。 她就那樣靜靜地躺著逆日,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萄凤。 梳的紋絲不亂的頭發(fā)上室抽,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音靡努,去河邊找鬼坪圾。 笑死,一個胖子當著我的面吹牛惑朦,可吹牛的內(nèi)容都是我干的神年。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼行嗤,長吁一口氣:“原來是場噩夢啊……” “哼已日!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栅屏,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤飘千,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栈雳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體护奈,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年哥纫,在試婚紗的時候發(fā)現(xiàn)自己被綠了霉旗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛀骇,死狀恐怖厌秒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情擅憔,我是刑警寧澤鸵闪,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站暑诸,受9級特大地震影響蚌讼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜个榕,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一篡石、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧西采,春花似錦凰萨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿诊。三九已至狱杰,卻和暖如春瘦材,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仿畸。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工食棕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人错沽。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓簿晓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親千埃。 傳聞我的和親對象是個殘疾皇子憔儿,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容