`
啸笑天
  • 浏览: 3462642 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

理解UIApplication

 
阅读更多

iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示: 
int UIApplicationMain ( 
int argc, 
char *argv[], 
NSString *principalClassName, 
NSString *delegateClassName 
); 
那么UIApplicationMain函数到底做了哪些事情呢?这个函数主要负责三件 事情: 
1)从给定的类名初始化应用程序对象,也就是初始化UIApplication或者子类对象的一个实例,如果你在这里给定的是nil,那么 系统会默认UIApplication类,也就主要是这个类来控制以及协调应用程序的运行。在后续的工作中,你可以用静态方法sharedApplication 来获取应用程序的句柄。 
2)从给定的应用程序委托类,初始化一个应用程序委托。并把该委托设置为应用程序的委托,这里就有如果传入参数为nil,会调用函数访问 Info.plist文件来寻找主nib文件,获取应用程序委托。 
3)启动主事件循环,并开始接收事件。 
上面是UIApplicationMain函数的工作,接下来一个问题是应用程序视图的显示、消息的控制怎么办?下面就是UIApplication(或 者子类)对象的职责,这个对象主要做下面几件事: 
1)负责处理到来的用户事件,并分发事件消息到应该处理该消息的目标对象(sender,  action)。 
2)管理以及控制视图,包括呈现、控制行为、当前显示视图等。 
3)该对象有一个应用程序委托对象,当一些生命周期内重要事件(可以包括系统事件或者生命周期控制事件)发生时,应用程序通知该对象。例如,应用程序启 动、内存不够了或者应用程序结束等,让这些事件发生时,应用程序委托去响应。 

通 过上面的分析,可以知道UIApplication对开发者来说,是一个黑箱,它也可以是。因为所有的操作,都可以由它的委托来帮我们完成,它只需要在 后面维护一些不可更改的东西,如事件消息分发和传递、给委托发送事件处理请求等等,如,应用程序加载处理完毕,它会发送消息给委托,然后委托可以在 applicationDidFinishLanching委托函数中去实现开发者想要的动作。利用XCODE在创建应用程序时,会默认实现一个应用程序 委托类。而对于加载的视图,则有视图相关的委托类来处理视图加载过程的生命事件。下面说明委托(
UIApplicationDelegate)主要的一些方法: 

现在来看协议中定义的这些需要实现的方法分别是什么作用: 
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框变化完成后执行 

 

可以看到UIApplication的头文件实现 
@interface UIApplication :UIResponder <UIActionSheetDelegate>{ 
@package 
id<UIApplicationDelegate> _delegate ;  //这就是应用程序委托。 
NSTimer ....... 

因此,在UIApplication中处理的系统事件时,只需转到_delegate这个类去处理, 这个类对象就是应用程序委托对象。我们可以从应用程序的单例类对象中得到应用程序委托的对象 
UIApplicationDelegate* myDelegate = [[UIApplication sharedApplication] delegate]; 

UIApplication 接收到所有的系统事件和生命周期事件时,都会把事件传递给UIApplicationDelegate进行处理,对于用户输入 事件,则传递给相应的目标对象去处理。比如我们在应用程序被来电等消息后,可以调用应用程序委托类的 applicationWillResignActive()方法,这个方法在用户锁住屏幕时,也会调用,与之相适应的是应用程序重新被用户打开时的委托 方法。另外常用的就是内存不足的系统警告,此时会调用应用程序委托类的applicationDidReceiveMemoryWarning()方法, 然后我们就可以试着释放一些内存了。 
上面就是应用程序生命周期(启动,中止,恢复,退出等过程)的应用程序处理



 

 

iPhone中的应用程序很容易受到打扰,比如一个来电可能导致应用程序失去焦点,如果这个时候接听了电话,那么应用程序会转到后台运行。还有很多其它类似的事件会导致iPhone应用程序失去焦点,在应用程序失去焦点前会调用委托类的applicationWillResignActive()方法,而应用程序再次获取到焦点的时候会调用applicationDidBecomeActive()方法。比如在运行应用程序的时候锁屏会调用委托类的applicationWillResignActive()方法,而当屏幕被解锁的时候,又会调用applicationDidBecomeActive()方法。

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

 

 

下面是这个类的一些功能:

1.设置icon上的数字图标

    //设置主界面icon上的数字图标,在2.0中引进, 缺省为0

    [UIApplicationsharedApplication].applicationIconBadgeNumber = 4;

2.设置摇动手势的时候,是否支持redo,undo操作

    //摇动手势,是否支持redo undo操作。

   //3.0以后引进,缺省YES

    [UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;

3.判断程序运行状态

    //判断程序运行状态,在2.0以后引入

    /*

     UIApplicationStateActive,

     UIApplicationStateInactive,

     UIApplicationStateBackground

     */

   if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){

        NSLog(@"程序在运行状态");

    }

4.阻止屏幕变暗进入休眠状态

    //阻止屏幕变暗,慎重使用,缺省为no 2.0

    [UIApplicationsharedApplication].idleTimerDisabled =YES;

慎重使用本功能,因为非常耗电。

5.显示联网状态

    //显示联网标记 2.0

    [UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;

6.在map上显示一个地址

   NSString* addressText =@"1 Infinite Loop, Cupertino, CA 95014";

   // URL encode the spaces

    addressText =  [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

   NSString* urlText = [NSStringstringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];

    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];

7.发送电子邮件

   NSString *recipients =@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";

   NSString *body =@"&body=It is raining in sunny California!";

    NSString *email = [NSStringstringWithFormat:@"%@%@", recipients, body];

    email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];

8.打电话到一个号码

    // Call Google 411

    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];

9.发送短信

    // Text to Google SMS

    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];

10.打开一个网址

   // Lanuch any iPhone developers fav site

    [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];

  • 大小: 43.2 KB
分享到:
评论

相关推荐

    UIApplication介绍

    通过实践,你可以更深入地理解UIApplication在iOS应用中的核心地位,以及如何有效利用它来构建高效、响应迅速的应用。在学习过程中,不断尝试和探索,掌握UIApplication的各种方法和属性,将对提升iOS开发技能...

    UIApplication使用

    在iOS应用开发中,`UIApplication` 是一个至关...理解并熟练运用 `UIApplication` 是构建高效、健壮的 iOS 应用的基础。通过不断实践和学习,开发者能够更好地掌握这一核心组件,从而提高应用的用户体验和整体性能。

    UIApplication深入学习

    本文将深入探讨 `UIApplication` 的主要方法,帮助开发者更好地理解和应对 iOS 应用的各种状态变化。 1. `- (void)applicationWillResignActive:(UIApplication *)application`:当应用程序即将进入非活动状态时,...

    UIApplication设置程序图标右上⾓红⾊数字_联⺴指⽰器

    在iOS开发中,`UIApplication` 是一个至关重要的类,它代表了应用程序的顶级对象,用于管理应用程序的整体生命周期、处理事件以及与其他系统服务交互。...这将有助于理解如何在实际项目中集成和控制这些视觉反馈元素。

    UIApplication_Delegate_post

    ### UIApplication Delegate 生命周期详解 在iOS应用开发中,`UIApplicationDelegate`协议是极其重要的组成部分之一,它定义了一系列的方法,用于处理应用程序的生命周期事件。本文将通过详细图解的方式介绍`...

    UIApplication

    通过研究这个资源,开发者可以深入理解`UIApplication`的工作原理,并学习如何有效地利用它来增强应用程序的功能和用户体验。在实际项目中,对`UIApplication`的深入理解和灵活运用是构建高质量iOS应用的基础。

    IOS 中UIApplication详解及实例

    在iOS开发中,UIApplication是应用程序的核心对象,它管理着整个应用程序的生命周期,包括启动、运行、暂停、恢复和退出等过程。UIApplication不仅控制着...理解和熟练运用UIApplication是iOS开发中不可或缺的一部分。

    UIApplication_Delegate

    ### UIApplication_Delegate详解 在iOS应用开发中,`UIApplicationDelegate`协议扮演着至关重要的角色,它定义了应用程序与其委托对象之间交互的方式。通过实现这个协议的方法,开发者可以控制应用程序的生命周期...

    UIApplication_Delegate_post_4_v121.rar_android

    在Android开发中,`UIApplication_Delegate` 这个概念通常对应于iOS开发中的UIApplicationDelegate,但这里结合了"android"标签,我们理解为Android中的类似概念,即Activity或Application的生命周期管理。...

    swift-网页打开或者推送根据url地址跳转到相应界面

    综上所述,为了实现在Swift中根据URL地址跳转到相应界面,你需要理解并掌握URL Scheme、Deep Linking和Universal Links的概念和技术。在实际项目中,你还需要根据具体需求进行适配和扩展,确保不同来源的URL都能正确...

    通过实现TableView来理解IOS编程

    - **UIApplication**:应用程序的主要入口,用于启动和管理应用的运行周期。 - **Windows & Views**:窗口和视图系统,是用户界面的基本组成部分。 - **动画**:提供丰富的动画支持,帮助开发者创建流畅且具有吸引力...

    ios系统点击源码,实现iphone手机上的系统点击事件

    通过`UIEvent`对象,你可以创建一个触摸事件,然后使用`UIApplication.shared.sendEvent(_:)`方法将这个事件发送给系统。这种方式需要谨慎使用,因为它可能影响到其他正在运行的事件。 4. **私有API**: - 尽管不...

    iphone委托和生命周期.doc

    在iOS开发中,理解和掌握委托模式(Delegate Pattern)及应用的生命周期管理是至关重要的。通过本篇文档,我们将深入探讨`UIApplicationDelegate`协议及其在应用程序生命周期管理中的作用。本文将详细介绍如何加载...

    iOS中的应用启动原理以及嵌套模型开发示例详解

    在iOS开发中,理解应用的启动原理和嵌套模型对于优化性能和构建高效的应用至关重要。本文将深入探讨这两个主题,并提供Objective-C代码示例。 首先,我们来详细讲解iOS应用的启动过程。当用户点击应用图标时,系统...

    applicationDelegate使用

    1. `- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary,id&gt; *)launchOptions` (Objective-C) 或 `func application(_ application: UIApplication, ...

    swift-应用跳转到系统的各级设置界面

    UIApplication.shared.open(url, options: [:], completionHandler: nil) } } ``` 2. **应用的隐私设置**:如果你想让用户查看或修改应用的隐私权限,如相机或麦克风权限,可以使用如下代码: ```swift if let ...

    iphone笔记

    在iOS开发中,理解应用程序的生命周期至关重要。这有助于开发者合理地安排程序的行为,确保在不同的运行状态下能够正确处理各种事件,比如用户交互、系统资源管理和后台操作等。苹果提供了一系列的方法来帮助开发者...

    ios一个app应用内部调用另一个新的app应用

    首先,我们需要理解什么是URL Scheme。URL Scheme是一种类似于http或https的自定义协议,但它是专门为特定应用定义的。每个应用都可以注册自己的URL Scheme,以便其他应用可以通过这个唯一的标识来调用它。例如,...

    iOS无操作退出登录

    在iOS中,我们可以利用`UIApplication`的`idleTimer`属性,这是一个定时器,当用户没有与屏幕进行交互(如触摸、键盘输入等)达到一定时间后,系统会认为应用处于空闲状态。默认情况下,当应用进入后台或屏幕关闭时...

    iOS播放器特效,锁屏状态下显示专辑图片和信息

    在iOS应用开发中,为用户提供优质的音乐播放体验是至关重要的,而实现锁屏状态下显示专辑图片和信息...在PRemoteDemo项目中,你可以找到一个完整的示例,通过研究其代码结构和实现方式,能进一步加深对这一特性的理解。

Global site tag (gtag.js) - Google Analytics