文档章节

UIApplication对象及其代理UIApplicationDelegate[转]

今日竹石
 今日竹石
发布于 2014/02/13 19:54
字数 1244
阅读 29
收藏 0

在开发过程中我们需要一些全局对象来将程序的各个部分连接起来,这些全局对象中最重要的就是UIApplication对象。但在实际编程中我们并不直接和UIApplication对象打交道,而是和其代理 打交道。

UIApplication 是iPhone应用程序的开始并且负责初始化并显示UIWindow,并负责加载应用程序的第一个UIView到UIWindow窗体中。 UIApplication的另一个任务是帮助管理应用程序的生命周期,而UIApplication通过一个名字为 UIApplicationDelegate的代理类来履行这个任务。尽管UIApplication会负责接收事件,而 UIApplicationDelegate则决定应用程序如何去响应这些事件,UIApplicationDelegate可以处理的事件包括应用程序 的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告),本文会介绍如何加载应用程序的UIView到UIWindow以及如何利用 UIApplicationDelegate处理系统事件。

通 常对于UIApplication读者是没必要修改它的,只需要知道UIApplication接收系统事件即可,而如何编写代码来处理这些系统事件则是 程序员的工作。处理系统事件需要编写一个继承自UIApplicationDelegate接口的类,而UIApplicationDelegate接口 提供生命周期函数来处理应用程序以及应用程序的系统事件。

如 果利用Xcode的模板创建项目,Xcode会为程序员创建继承自UIApplicationDelegate的类,但不会自动实现继承自 UIApplicationDelegate的可选的事件处理函数。如果读者创建一个名为“TestUIApplication”的项目,Xcode会自 动创建TestUIApplicationAppDelegate.h和TestUIApplicationAppDelegate.m文件,文件的声明 如下:
@interface TestUIApplicationAppDelegate : NSObject <UIApplicationDelegate>
而应用程序的UIApplication则被定义在MainWindow.xib文件中,并且有一个作为outlet的UIApplicationDelegate引用。

iPhone 并不是多任务的操作系统,所以应用程序很容易受到打扰,比如一个来电可能导致应用程序失去焦点,如果这个时候接听了电话,那么应用程序会自动终止运行。还 有很多其它类似的事件会导致iPhone应用程序失去焦点,在应用程序失去焦点前会调用委托类的 applicationWillResignActive()方法,而应用程序再次获取到焦点的时候会调用 applicationDidBecomeActive()方法。比如在运行应用程序的时候锁屏会调用委托类的 applicationWillResignActive()方法,而当屏幕被解锁的时候,又会调用 applicationDidBecomeActive()方法。

另 外一个非常重要的方法就是applicationDidReceiveMemoryWarning(),因为iPhone设备只有有限的内存,如果为应用 程序分配了太多内存操作系统会终止应用程序的运行,但在终止之前操作系统会通过先调用委托类的 applicationDidReceiveMemoryWarning()方法警告应用程序,在UIApplication接收到这个事件后它会传递给 委托类的applicationDidReceiveMemoryWarning()方法,委托类在这个方法内可以进行释放内存的操作以防止操作系统强制 终止应用程序的运行。

现在来看协议中定义的这些需要实现的方法分别是什么作用:
1、- (void)applicationWillResignActive:(UIApplication *)application
说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
2、- (void)applicationDidBecomeActive:(UIApplication *)application
说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
4、- (void)applicationWillEnterForeground:(UIApplication *)application
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
5、- (void)applicationWillTerminate:(UIApplication *)application
说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止
7、- (void)applicationSignificantTimeChange:(UIApplication*)application
说明:当系统时间发生改变时执行
8、- (void)applicationDidFinishLaunching:(UIApplication*)application
说明:当程序载入后执行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当StatusBar框将要变化时执行
10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
说明:当通过url执行
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
说明:当StatusBar框方向变化完成后执行
13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
说明:当StatusBar框变化完成后执行


© 著作权归作者所有

今日竹石
粉丝 41
博文 227
码字总数 181391
作品 0
朝阳
程序员
私信 提问
UIApplication对象及其代理UIApplicationDelegate

在开发过程中我们需要一些全局对象来将程序的各个部分连接起来,这些全局对象中最重要的就是UIApplication对象。但在实际编程中我们并不直接和UIApplication对象打交道,而是和其代理 打交道...

今日竹石
2014/01/22
98
0
UI第一天(main的介绍)

#import <UIKit/UIKit.h> //UIKit是系统的一个框架,里面包含了IOS应用开发中几乎所有的视图控件 //相关的类和其他的一些常用的类,也包含了Foundation库 #import "AppDelegate.h" //遵守了U...

鹿微微鹿
2016/04/05
9
0
iOS应用程序的窗口元素及其运行原理

一、应用程序窗口元素 UIWindow:每一个应用程序都有属于自己的UIWindow,UIWindow继承自UIView UIView:视图,屏幕上可视的控件都是UIView,如按钮、文本标签、表格 UIViewController:控制...

开发小菜鸟一枚
2013/11/06
594
0
iphone应用程序执行过程

// 收到UIApplicationWillResignActiveNotification通知时调用applicationWillResignActive方法。// 相当于,程序进入后台,调用applicationWillResignActive执行数据保存工作[[NSNotificat...

JohnZr
2012/06/12
273
1
AppDelegate 中的方法

AppDelegate 中的方法 1、- (void)applicationWillResignActive:(UIApplication )application 说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了 2、...

JohnZr
2012/08/17
164
0

没有更多内容

加载失败,请刷新页面

加载更多

检查字符串是否不为空且不为空

如何检查字符串是否不为null也不为空? public void doStuff(String str){ if (str != null && str != "**here I want to check the 'str' is empty or not**") { /* handl......

javail
4分钟前
7
0
No module named 'apscheduler.schedulers'

关于 ModuleNotFoundError: No module named 'apscheduler.schedulers' 和 ModuleNotFoundError: No module named 'apscheduler' 的问题,网上有不少解决。大多数都是因为,文件起名与模块名......

開援带碼
25分钟前
27
0
如何查看Android的系统版本?

有谁知道我怎么能检查系统版本(例如1.0 , 2.2 ,等)编程? #1楼 我无法对答案发表评论,但是Kaushik的答案存在一个严重错误:SDK_INT与系统版本不同,但实际上是指API级别。 if(Build.VER...

技术盛宴
51分钟前
35
0
引入AI变量,精准农业正在加速豹变?

  不久前,“江苏省脱贫率达 99.99%,尚未脱贫人数仅剩 6 户、17 人”这样一则新闻刷屏。“把这 17 个人迁出,江苏就全省脱贫”、“最后这 6 户人家拖了后腿”,在网民们的调侃和质疑声背后...

水果黄瓜
54分钟前
41
0
Elasticsearch系列---结构化搜索

概要 结构化搜索针对日期、时间、数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么...

清茶豆奶
今天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部