您的位置:首页 > 移动开发

UIApplication

2015-12-18 15:28 429 查看


什么是UIApplication


UIApplication对象是应用程序的象征

每一个应用都有自己的UIApplication对象,而且是单例的
通过 [UIApplication sharedApplication]可以获得这个单例对象
一个iOS程序启动后创建的第一个对象就是UIApplication
利用UIApplication对象,能进行一些应用级别的操作


利用UIApplication可以做哪些应用级别的操作?


设置应用程序图标右上角的红色提醒数字

iOS8更新之后,在设置applicationIconBadgeNumber时提示错误,原因是iOS8之后设置应用程序的applicationIconBadgeNumber需要用户授权

授权方式如下:

if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}


联网操作时,状态栏上的等待图标指示器。waiting图标

UIApplication*app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible=YES;


利用UIApplication打开某个资源

UIApplication有个功能十分强大的openURL:方法 
- (BOOL)openURL:(NSURL*)url;


openURL:方法的部分功能有

打电话
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];

发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];

发邮件
[app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];

打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];


还可以打开其他app程序


通过UIApplication管理状态栏


注意

如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置




在ios7系统下,状态栏默认是交给控制器去管理的,控制器实现下面两个方法就可以控制状态栏的显示、隐藏以及样式

/**
*  隐藏状态栏
*/
- (BOOL)prefersStatusBarHidden {
return YES;
}
/**
*  改变状态栏样式
*/
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}


在ios7系统下,状态栏要想交给UIApplication管理,要在Info.plist中设置View controller-based status bar appearance 为 NO

UIApplication *app = [UIApplication sharedApplication];
/****** 无动画 ***********/
app.statusBarHidden = YES;
app.statusBarStyle = UIStatusBarStyleLightContent;
/****** 有动画 ***********/
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];


UIApplication管理状态栏的好处:

可以设置动画
更灵活,可以随时随地的设置状态栏样式。


UIApplication和delegate


简介

所有的移动操作系统都有个致命的缺点:app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止

还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件

delegate可处理的事件包括: 

应用程序的生命周期事件(如程序启动和关闭) 

系统事件(如来电) 

内存警告 



每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理

NJAppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理


delegate方法调用时机

/**
*  app 启动完毕后调用(在启动图片消失后调用)
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}

/**
*  app 即将失去焦点调用
*/
- (void)applicationWillResignActive:(UIApplication *)application {
一般在这个方法执行如下操作:
* 暂停正在执行的任务
* 禁止计时器
* 若为游戏应暂停游戏
}

/**
*  app 进入后台调用(已经进入后台)
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
一般在这个方法执行如下操作:
* 保存当前应用信息和应用状态
* 保存用户数据(写到沙盒)
* 若为游戏,保存游戏积分
* 废除定时器
}

/**
*  app 即将进入前台调用
*/
- (void)applicationWillEnterForeground:(UIApplication *)application {
这个方法用来撤销applicationWillResignActive中做的改变。
}

/**
*  app 获得焦点调用(已经进入前台)
*/
- (void)applicationDidBecomeActive:(UIApplication *)application {
这个方法用来撤销applicationDidEnterBackground中做的改变
}

/**
*
*  app 即将终止的时候调用(要模拟该方法调用需要在Info.plist文件中设置Application does not run in background为 YES;然后从前台回到后台)
*   注意:如果应用程序处于挂起状态的时候,无法调用该方法。
*/

- (void)applicationWillTerminate:(UIApplication *)application {
程序即将退出时调用。记得保存数据,如applicationDidEnterBackground方法一样。
}

/**
*  app 接收到内容警告的时候会调用
*/
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
这个方法用来清除不需要再使用的内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: