iOS开发UI篇 程序启动原理和UIApplication
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一、UIApplication
1.簡(jiǎn)單介紹
(1)UIApplication對(duì)象是應(yīng)用程序的象征,一個(gè)UIApplication對(duì)象就代表一個(gè)應(yīng)用程序。
(2)每一個(gè)應(yīng)用都有自己的UIApplication對(duì)象,而且是單例的,如果試圖在程序中新建一個(gè)UIApplication對(duì)象,那么將報(bào)錯(cuò)提示。
(3)通過[UIApplication sharedApplication]可以獲得這個(gè)單例對(duì)象
(4)?一個(gè)iOS程序啟動(dòng)后創(chuàng)建的第一個(gè)對(duì)象就是UIApplication對(duì)象,且只有一個(gè)(通過代碼獲取兩個(gè)UIApplication對(duì)象,打印地址可以看出地址是相同的)。
(5)利用UIApplication對(duì)象,能進(jìn)行一些應(yīng)用級(jí)別的操作
2.應(yīng)用級(jí)別的操作示例:
1)設(shè)置應(yīng)用程序圖標(biāo)右上角的紅色提醒數(shù)字(如QQ消息的時(shí)候,圖標(biāo)上面會(huì)顯示1,2,3條新信息等。)
@property(nonatomic)?NSInteger?applicationIconBadgeNumber;
代碼實(shí)現(xiàn)和效果:?
-?(void)viewDidLoad {[super?viewDidLoad];????//創(chuàng)建并添加一個(gè)按鈕UIButton?*btn=[[UIButton?alloc]initWithFrame:CGRectMake(100,?100,?60,?30)];[btn?setTitle:@"按鈕"?forState:UIControlStateNormal];[btn?setBackgroundColor:[UIColor?brownColor]];[btn?addTarget:self?action:@selector(onClick)?forControlEvents:UIControlEventTouchUpInside];[self.view?addSubview:btn]; } -(void)onClick {NSLog(@"按鈕點(diǎn)擊事件");????//錯(cuò)誤,只能有一個(gè)唯一的UIApplication對(duì)象,不能再進(jìn)行創(chuàng)建//????UIApplication?*app=[[UIApplication?alloc]init];????//通過sharedApplication獲取該程序的UIApplication對(duì)象UIApplication?*app=[UIApplication?sharedApplication];????app.applicationIconBadgeNumber=123;}2)設(shè)置聯(lián)網(wǎng)指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible)?BOOL?networkActivityIndicatorVisible;
代碼和效果:?
??//設(shè)置指示器的聯(lián)網(wǎng)動(dòng)畫app.networkActivityIndicatorVisible=YES;3)管理狀態(tài)欄
從iOS7開始,系統(tǒng)提供了2種管理狀態(tài)欄的方式
a.通過UIViewController管理(每一個(gè)UIViewController都可以擁有自己不同的狀態(tài)欄).
在iOS7中,默認(rèn)情況下,狀態(tài)欄都是由UIViewController管理的,UIViewController實(shí)現(xiàn)下列方法就可以輕松管理狀態(tài)欄的可見性和樣式
狀態(tài)欄的樣式 ???- (UIStatusBarStyle)preferredStatusBarStyle;?
狀態(tài)欄的可見性 -(BOOL)prefersStatusBarHidden;
#pragma?mark-設(shè)置狀態(tài)欄的樣式 -(UIStatusBarStyle)preferredStatusBarStyle {????//設(shè)置為白色????//return?UIStatusBarStyleLightContent;????//默認(rèn)為黑色return?UIStatusBarStyleDefault; }#pragma?mark-設(shè)置狀態(tài)欄是否隱藏(否) -(BOOL)prefersStatusBarHidden {????return?NO; }b.通過UIApplication管理(一個(gè)應(yīng)用程序的狀態(tài)欄都由它統(tǒng)一管理)
如果想利用UIApplication來管理狀態(tài)欄,首先得修改Info.plist的設(shè)置
?
代碼:
??//通過sharedApplication獲取該程序的UIApplication對(duì)象UIApplication?*app=[UIApplication?sharedApplication];app.applicationIconBadgeNumber=123;????//設(shè)置指示器的聯(lián)網(wǎng)動(dòng)畫app.networkActivityIndicatorVisible=YES;????//設(shè)置狀態(tài)欄的樣式????//app.statusBarStyle=UIStatusBarStyleDefault;//默認(rèn)(黑色)????//設(shè)置為白色+動(dòng)畫效果[app?setStatusBarStyle:UIStatusBarStyleLightContent?animated:YES];????//設(shè)置狀態(tài)欄是否隱藏app.statusBarHidden=YES;??????//設(shè)置狀態(tài)欄是否隱藏+動(dòng)畫效果[app?setStatusBarHidden:YES?withAnimation:UIStatusBarAnimationFade];c.補(bǔ)充
既然兩種都可以對(duì)狀態(tài)欄進(jìn)行管理,那么什么時(shí)候該用什么呢?
如果狀態(tài)欄的樣式只設(shè)置一次,那就用UIApplication來進(jìn)行管理;
如果狀態(tài)欄是否隱藏,樣式不一樣那就用控制器進(jìn)行管理。
UIApplication來進(jìn)行管理有額外的好處,可以提供動(dòng)畫效果。
?4)openURL:方法
UIApplication有個(gè)功能十分強(qiáng)大的openURL:方法
- (BOOL)openURL:(NSURL*)url;
openURL:方法的部分功能有
打電話??UIApplication *app = [UIApplicationsharedApplication];?[app openURL:[NSURLURLWithString:@"tel://10086"]];
發(fā)短信??[app openURL:[NSURLURLWithString:@"sms://10086"]];
發(fā)郵件??[app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
打開一個(gè)網(wǎng)頁(yè)資源?[app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
打開其他app程序???openURL方法,可以打開其他APP。
?URL補(bǔ)充:
URL:統(tǒng)一資源定位符,用來唯一的表示一個(gè)資源。
URL格式:協(xié)議頭://主機(jī)地址/資源路徑
網(wǎng)絡(luò)資源:http/ ftp等?? 表示百度上一張圖片的地址?? http://www.baidu.com/images/20140603/abc.png
本地資源:file:///users/apple/desktop/abc.png(主機(jī)地址省略)
?
二、UIApplication Delegate
1.簡(jiǎn)單說明
所有的移動(dòng)操作系統(tǒng)都有個(gè)致命的缺點(diǎn):app很容易受到打擾。比如一個(gè)來電或者鎖屏?xí)?dǎo)致app進(jìn)入后臺(tái)甚至被終止。
還有很多其它類似的情況會(huì)導(dǎo)致app受到干擾,在app受到干擾時(shí),會(huì)產(chǎn)生一些系統(tǒng)事件,這時(shí)UIApplication會(huì)通知它的delegate對(duì)象,讓delegate代理來處理這些系統(tǒng)事件。
作用:當(dāng)被打斷的時(shí)候,通知代理進(jìn)入到后臺(tái)。
每次新建完項(xiàng)目,都有個(gè)帶有“AppDelegate”字眼的類,它就是UIApplication的代理,NJAppDelegate默認(rèn)已經(jīng)遵守了UIApplicationDelegate協(xié)議,已經(jīng)是UIApplication的代理。
2.代理方法
?1?#import?"YYAppDelegate.h"?2??3?@implementation?YYAppDelegate?4??5?//?當(dāng)應(yīng)用程序啟動(dòng)完畢的時(shí)候就會(huì)調(diào)用(系統(tǒng)自動(dòng)調(diào)用)?6?-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?7?{?8?????NSLog(@"didFinishLaunchingWithOptions");?9?????return?YES;10?}11?12?//?即將失去活動(dòng)狀態(tài)的時(shí)候調(diào)用(失去焦點(diǎn),?不可交互)13?-?(void)applicationWillResignActive:(UIApplication?*)application14?{15?????NSLog(@"ResignActive");16?}17?18?//?重新獲取焦點(diǎn)(能夠和用戶交互)19?-?(void)applicationDidBecomeActive:(UIApplication?*)application20?{21?????NSLog(@"BecomeActive");22?}23?24?//?應(yīng)用程序進(jìn)入后臺(tái)的時(shí)候調(diào)用25?//?一般在該方法中保存應(yīng)用程序的數(shù)據(jù),?以及狀態(tài)26?-?(void)applicationDidEnterBackground:(UIApplication?*)application27?{28?????NSLog(@"Background");29?}30?31?//?應(yīng)用程序即將進(jìn)入前臺(tái)的時(shí)候調(diào)用32?//?一般在該方法中恢復(fù)應(yīng)用程序的數(shù)據(jù),以及狀態(tài)33?-?(void)applicationWillEnterForeground:(UIApplication?*)application34?{35?????NSLog(@"Foreground");36?}37?38?//?應(yīng)用程序即將被銷毀的時(shí)候會(huì)調(diào)用該方法39?//?注意:如果應(yīng)用程序處于掛起狀態(tài)的時(shí)候無法調(diào)用該方法40?-?(void)applicationWillTerminate:(UIApplication?*)application41?{42?}43?44?//?應(yīng)用程序接收到內(nèi)存警告的時(shí)候就會(huì)調(diào)用45?//?一般在該方法中釋放掉不需要的內(nèi)存46?-?(void)applicationDidReceiveMemoryWarning:(UIApplication?*)application47?{48?????NSLog(@"MemoryWarning");49?}50?@end應(yīng)用程序一般有五個(gè)狀態(tài):官方文檔app.states
?
三、程序啟動(dòng)原理
UIApplicationMain
main函數(shù)中執(zhí)行了一個(gè)UIApplicationMain這個(gè)函數(shù)
intUIApplicationMain(int?argc,?char?*argv[],?NSString?*principalClassName,?NSString?*delegateClassName);
argc、argv:直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可?
principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認(rèn)值
?delegateClassName:指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議
UIApplicationMain函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對(duì)象,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象,并將該delegate對(duì)象賦值給UIApplication對(duì)象中的delegate屬性
接著會(huì)建立應(yīng)用程序的Main Runloop(事件循環(huán)),進(jìn)行事件的處理(首先會(huì)在程序完畢后調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時(shí)UIApplicationMain函數(shù)才返回
按 Ctrl+C 復(fù)制代碼
按 Ctrl+C 復(fù)制代碼
?
系統(tǒng)入口的代碼和參數(shù)說明:
argc:系統(tǒng)或者用戶傳入的參數(shù)
argv:系統(tǒng)或用戶傳入的實(shí)際參數(shù)?
1.根據(jù)傳入的第三個(gè)參數(shù),創(chuàng)建UIApplication對(duì)象
2.根據(jù)傳入的第四個(gè)產(chǎn)生創(chuàng)建UIApplication對(duì)象的代理
3.設(shè)置剛剛創(chuàng)建出來的代理對(duì)象為UIApplication的代理
4.開啟一個(gè)事件循環(huán)(可以理解為里面是一個(gè)死循環(huán))這個(gè)時(shí)間循環(huán)是一個(gè)隊(duì)列(先進(jìn)先出)先添加進(jìn)去的先處理
?
ios程序啟動(dòng)原理
?四、程序啟動(dòng)的完整過程
1.main函數(shù)
2.UIApplicationMain
* 創(chuàng)建UIApplication對(duì)象
* 創(chuàng)建UIApplication的delegate對(duì)象
?
3.delegate對(duì)象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
* 程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
* 創(chuàng)建和設(shè)置UIWindow的rootViewController
* 顯示窗口
?
3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
* 創(chuàng)建UIWindow
* 創(chuàng)建和設(shè)置UIWindow的rootViewController
* 顯示窗口?
UIApplication的代理事件 ?Xcode解釋
// 1. 應(yīng)用程序啟動(dòng)完成,會(huì)調(diào)用此方法,啟動(dòng)之后,將不再調(diào)用此方法!
// 如果因?yàn)閮?nèi)存等原因,應(yīng)用程序被操作系統(tǒng)干掉,再次點(diǎn)擊圖標(biāo),會(huì)調(diào)用此方法!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
??? NSLog(@"應(yīng)用程序啟動(dòng)");
???
??? return YES;
}
// 2. 應(yīng)用程序注銷激活狀態(tài),游戲應(yīng)該再此方法中暫停游戲進(jìn)程!此方法在游戲開發(fā)中尤為重要!
- (void)applicationWillResignActive:(UIApplication *)application
{
??? NSLog(@"%s", __func__);
???
??? // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
??? // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
// 3. 應(yīng)用程序退出到后臺(tái),釋放共享資源,保存用戶數(shù)據(jù),停止時(shí)鐘,保存足夠的應(yīng)用程序狀態(tài)信息...
- (void)applicationDidEnterBackground:(UIApplication *)application
{
??? NSLog(@"%s", __func__);
??? // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
??? // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
// 4. 應(yīng)用程序進(jìn)入前臺(tái),如果在進(jìn)入后臺(tái)保存數(shù)據(jù)等操作,在此方法中,回復(fù)進(jìn)入后臺(tái)的操作
- (void)applicationWillEnterForeground:(UIApplication *)application
{
??? NSLog(@"%s", __func__);
??? // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
// 5. 應(yīng)用程序變成活動(dòng)狀態(tài),重新啟動(dòng)原來暫停的狀態(tài)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
??? NSLog(@"%s", __func__);
??? // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
// 6. 應(yīng)用程序?qū)⒈唤K止
- (void)applicationWillTerminate:(UIApplication *)application
{
??? // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
轉(zhuǎn)載于:https://my.oschina.net/kaqijiang/blog/596407
總結(jié)
以上是生活随笔為你收集整理的iOS开发UI篇 程序启动原理和UIApplication的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于登录
- 下一篇: 第一次打开Lightroom时的基本设置