UIApplication

UIApplication

1.UIApplicationMain

  • 在main.m的main函数中执行了UIApplicationMain这个方法,这是iOS程序的入口点:
/*
* argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可
* principalClassName:指定应用程序类,该类必须是UIApplication或其子类。如果为nil,则用UIApplication类作为默认值
* delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议
*/
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
/*
* 方法说明:
* 1) 由第3个参数创建一个UIApplication对象,一个程序对应一个UIApplication对象(单例),UIApplication对象是程序的象征
* 2) 由第4个参数创建一个UIApplication的delegate对象
* 3) 开启一个消息循环(不断地监听地一些系统事件)
* 4) 监听到相应的事件后,就会给代理发送相应的消息,应用程序启动完成后,首先会调用代理对象的 application:didFinishLaunchingWithOptions: 方法
*/
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

2. UIApplication 说明

  • 2.1. UIApplication 是应用程序的核心,每一个程序在运行期必须有 UIApplication (或子类)的一个实例(有且仅有一个),通过 [UIApplication sharedApplication] 可以得到这个单例实例的指针

  • 2.2. UIApplication 帮助管理应用程序的生命周期,而它通过 delegate 来履行这个任务

  • 2.3. UIApplication 可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给 delegate 对象来处理,delegate 可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)。

  • 2.4. 在开发过程中,UIApplication 是一个非常重要的全局对象。但在实际编程中我们并不直接和UIApplication 对象打交道,而是和其代理打交道,它的代理必须遵守 UIApplicationDelegate 协议,代理提供了相关的生命周期方法来处理应用程序的系统事件

  • 2.5. iOS 设备的内存极其有限,如果为 app 分配了太多内存,操作系统会终止 app 的运行,在 UIApplication 接收到这个事件后它会调用代理的 applicationDidReceiveMemoryWarning 方法,代理在这个方法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行

3.UIApplicationDelegate

App启动流程

  • 3.1.ios并不是多任务的操作系统,所以app很容易受到打扰。比如一个来电可能导致app失去焦点,如果这个时候接听了电话,那么app会自动终止运行

  • 3.2.还有很多其它类似的事件会导致 app 失去焦点:

App失去焦点前会调用代理的applicationWillResignActive

App再次获取焦点时会调用代理的 applicationDidBecomeActive

在运行App 时锁屏会调用代理的 applicationWillResignActive;

当屏幕被解锁时,会调用代理的applicationDidBecomeActive。

@implementation AppDelegate
/** method 1.
 *  程序入口
 *  程序首次启动时执行,若直接启动,launchaOptions中没有数据;否则,launchOptions将包含对应方式的内容(如从微信中启动节奏大师)
 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    return YES;
}
/** method 2.
 *  程序将进入后台
 *  失去焦点前会调用代理的applicationWillResignActive 如锁屏 电话等
 *  程序将要失去激活状态(Active)状态时调用,比如按下HOME键或者有电话进来. 对应applicationWillEnterForeground(将进入前台),这个方法用来暂停正在执行的任务,禁止计时器,减少OpenGL ES帧率, 游戏App应该在此处暂停游戏
 */
- (void)applicationWillResignActive:(UIApplication *)application {
    // 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.
}
/** method 3.
 *  程序已经进入后台
 *  程序进入后台时调用,对应ApplicationDidBecomeActive(进入前台),此方法用来释放共享资源,保存数据到沙盒(磁盘),作废计时器,保存足够的状态以便恢复
 */
- (void)applicationDidEnterBackground:(UIApplication *)application {
    // 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.
}
/** method 4.
 *  程序即将进入前台
 *  程序即将进入前台时候调用,对应(applicationWillResignActive)(即将进入后台),此方法用来撤销(applicationWillResignActive)中做的改变
 */
- (void)applicationWillEnterForeground:(UIApplication *)application {
    // 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.
}
/** method 5.
 *  程序已经进入前台
 *  程序已经变成Active(激活)状态时调用 applicationDidBecomeActive
 *  对应 (applicationDidEnterBackground)(进入后台),如程序之前在后台,最好在此方法中刷新用户界面
 */
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // 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.
}
/** method 6.
 *  程序即将终止
 *  程序即将退出时候调用,在此处保存数据,类似(applicationDidEnterBackground)使用.
 */
- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end
  • 3.3. 应用程序成为激活状态后,才可以与用户进行交互。

  • 3.4. 如果要做保存游戏状态之类操作,应该在注销激活方法中处理,
    因为用户可能会双击home键,打开任务栏,此时应用程序不会退出到后台!

  • 3.5. 如果要做恢复游戏状态之类的操作,应该在成为激活方法中处理,
    因为用户可能是从任务栏中返回的。

  • 3.6. 如果应用程序运行过程中,内存或其他原因,程序被系统强行退出时,会调用Terminate方法,
    开发者,可以再此记录应用程序被退出前的状态,以便改进系统

  • 3.7. 应用程序退出到后台后,未必会是休眠状态,有可能会继续运行,例如:微博、QQ、音乐播放器等软件

  • 3.8. 在UIKit开发中,通常不用在delegate中写内存警告方法,直接在ViewController中进行处理即可。

4.应用程序的完整启动过程

  • 4.1.点击程序图标

  • 4.2.执行main函数

  • 4.3.执行UIApplicationMain函数

  • 4.4.创建UIApplication对象、UIApplication的delegate对象

  • 4.5.开启事件循环监听系统事件

  • 4.6.程序加载完毕后调用 delegate 对象的 application:didFinishLaunchingWithOptions: 方法:创建窗口UIWindow对象;创建控制器对象;设置窗口的根控制器;让窗口成为主窗口、并且可见。

5.UIApplication 常用方法:

// 设置图标右上角显示的数字
[app setApplicationIconBadgeNumber:10];

// 显示联网状态的提示,一般有网络请求时,会自动显示
[app setNetworkActivityIndicatorVisible:YES];

// 打开一个URL
// 在iOS中,很多东西都可以通过URL来访问,例如:电话、短信、电子邮件等
// 如下:

// 打开网站
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
[app openURL:url];

// 电话会直接呼出
NSURL *url = [NSURL URLWithString:@"tel://10010"];
[app openURL:url];

// 会跳出短信发送界面,等待用户编辑并发送短信
NSURL *url = [NSURL URLWithString:@"sms://10010"];
[app openURL:url];

2015-04-14 11:06:39 Write By MarkDown © Yun.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值