iOS面试-底层iOS Swift 学习

ios - UIApplication

2019-04-12  本文已影响21人  6e77c9b470d7

UIApplication
每一个应用程序都有自己的UIApplication单例对象。
一个iOS程序启动后创建的第一个对象就是UIApplication对象。

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
//程序一开始返回了UIApplicationMain方法,并且还有4个参数:
第三个参数 nil:代表UIApplication类名或者子类名称,nil 相当于 @"UIApplicaiton";
第四个参数 :代表UIApplicaiton的代理名称 NSStringFromClass([AppDelegate class] 相当于 @"AppDelegate";

UIApplicationMain底层实现

// 1.创建UIApplication
// 2.创建UIApplication代理对象,成为UIApplication代理
// 3.开启主运行循环,处理事件,可以让程序一直在运行
// 4.加载info.plist文件,判断有没有指定main.stroyboard,如果指定,就会去加载

ios程序的启动过程 打开程序=>执行main函数=>执行UIApplicationMain=>初始化UIApplication(创建和设置代理对象,开启事件循环):监听系统事件和代理生命周期方法 =>结束程序

利用UIApplication对象能进行一些应用级别的操作。
1、设置应用程序图标的提醒数字

UIApplication *app = [UIApplication sharedApplication];//可以获得单例对象。 
app.applicationIconBadgeNumber = 10;
// 创建通知对象
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
/ /注册用户通知
[app registerUserNotificationSettings:setting];
//注:苹果为了增强用户体验,在iOS8以后我们需要创建通知才能实现图标右上角提醒,iOS8之前直接设置applicationIconBadgeNumber的值即可。

2、设置联网的提示

app.networkActivityIndicatorVisible= YES;

3、管理状态栏
从iOS7开始,系统提供了2种管理状态栏的方式
如果状态栏的样式只设置一次,那就用UIApplication来进行管理,并且UIApplication可以提供动画效果;
如果状态栏是否隐藏,样式不一那就用每个控制器对自己的状态栏进行管理。
3.1、通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式

//状态栏的样式    - (UIStatusBarStyle)preferredStatusBarStyle;
//状态栏的可见性  -(BOOL)prefersStatusBarHidden;
#pragma mark-设置状态栏的样式
-(UIStatusBarStyle)preferredStatusBarStyle
{
  //设置为白色
  //return UIStatusBarStyleLightContent;
  //默认为黑色
   return UIStatusBarStyleDefault;
}
#pragma mark-设置状态栏是否隐藏(否)
-(BOOL)prefersStatusBarHidden
{
  return NO;
}

3.2、通过UIApplication管理(一个应用程序的状态栏都由它统一管理)如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置,添加iew controller-based status bar appearance行,并设置为NO即可

//通过sharedApplication获取该程序的UIApplication对象
UIApplication *app=[UIApplication sharedApplication];
//设置状态栏的样式
//app.statusBarStyle=UIStatusBarStyleDefault;//默认(黑色)
//设置为白色+动画效果
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
//设置状态栏是否隐藏
app.statusBarHidden=YES;
//设置状态栏是否隐藏+动画效果
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

4、UIApplication有个功能十分强大的openURL:方法

UIApplication *app = [UIApplicationsharedApplication];
//打电话  [app openURL:[NSURLURLWithString:@"tel://110"]];
//发短信  [app openURL:[NSURLURLWithString:@"sms://10086"]];
//发邮件  [app openURL:[NSURLURLWithString:@"mailto://xxcc@fox.com"]];
//打开一个网页资源 [app openURL:[NSURL URLWithString:@"http://www.baidu.com"]];
//打开其他app程序   openURL方法,可以打开其他APP。

=================
UIApplication Delegate
当app收到系统事件,例如程序运行中来电等,这时UIApplicaiton会通知它的代理delegate对象,让delegate代理来处理这些系统事件。
delegate可以处理的事件包括:
1、应用程序的生命周期事件(如程序启动和关闭)
2、系统事件(如来电)
3、内存警告(用处较多)
程序中的AppDelegate文件就是UIAppliacation的代理,它已经遵守了UIApplicationDelegate。

@interface AppDelegate : UIResponder <UIApplicationDelegate>

AppDelegate的方法

// AppDelegate:监听应用程序的生命周期
// 以下方法就是应用程序的生命周期方法

// 应用程序启动完成的时候就会调用AppDelegate的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"%s",__func__);
    return YES;
}

// 当应用程序失去焦点的时候调用
- (void)applicationWillResignActive:(UIApplication *)application {
     NSLog(@"%s",__func__);
}

// 当应用程序进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application {
     NSLog(@"%s",__func__);
    // 保存一些信息
}

// 当应用程序进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"%s",__func__);
}

// 当应用程序完全获取焦点的时候调用
// 只有当应用程序完全获取焦点的时候,才能够与用户交互
- (void)applicationDidBecomeActive:(UIApplication *)application {
     NSLog(@"%s",__func__);
}

// 当应用程序关闭的时候
- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end
上一篇下一篇

猜你喜欢

热点阅读