转 iOS应用程序的状态及其切换(生命周期)

0. iOS应用入口和AppDelegate

我最初开始iOS应用开发学习的时候,也没有像样的培训和指导,第一个要看的就是代码。我们知道Objective-C也是基于C的,于是我们找到了入口代码main()函数。通常代码如下:

?


1

2

3

4

5

6

int main(int argc, char *argv[])

{

   @autoreleasepool {

      return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));

   }

}

我们看到返回类型、函数名和参数都很熟悉。至于函数体,除了AutoRelease是自动释放池之外,执行的是一个名为UIApplicationMain的函数调用,后两个参数是nil(空)和一个MyAppDelegate类名字符串。

这个函数调用也就是这个iOS应用的开始,它进行了这个应用的初始化过程,并生成了一个类名为MyAppDelegate的对象。至于MyAppDelegate这个名字,这里只是一个示例,可以为其它命名,通常是应用统一定义的前缀+”AppDelegate”。这些都不重要,重要的是它实际上需要遵从于UIApplicationDelegate这个Protocol的定义,给出一些方法的实现。

那么这个“AppDelegate”又是什么呢?实际上,苹果已经为把每个应用包装成一个UIApplication对象,但应用每一步运行的细节并不需要开发者关注,只要关注这个应用对象对应的delegate即可,也就是这个“AppDelegate”。通过AppDelegate我们可以知道Application的运行状态,发生了哪些事件。

1. 程序的5个状态和对应的AppDelegate7个方法

至于五个状态,分别是:

§  Not Running, 未运行

§  Inactive,  非活动

§  Active, 活动

§  Background, 后台

§  Suspend, 挂起

对这5种状态,这里先不过多解释,看下图也许就会明白许多

从这个示意图,我们可以看到哪些状态间是可以互相转化的。而在这些状态互相转化的同时,AppDelegate中对应的生命周期方法会被调用:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 进程启动但还没完成初始化,这个方法是iOS6之后才有的

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions      

 

// 进程启动基本完成

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

 

// 应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件

- (void)applicationWillResignActive:(UIApplication *)application    

 

// 应用程序入活动状态,这个刚好跟上面那个方法相反

- (void)applicationDidBecomeActive:(UIApplication *)application    

 

// 程序被推送到后台,如果要设置后台继续运行,则在这个函数里面设置即可

- (void)applicationDidEnterBackground:(UIApplication *)application     

 

// 程序从后台将要回到前台

- (void)applicationWillEnterForeground:(UIApplication *)application   

 

// 程序将要退出

- (void)applicationWillTerminate:(UIApplication *)application

2. 应用一般启动过程

介绍了iOS应用的基本状态和生命周期方法之后,再简要对应用启动和前台状态做一个整理说明。

对于一般的iOS应用来说,启动之后是进入前台运行的,大概的流程如下图:

也就是说通常情况下,应用程序启动,图中的三个方法会被依次调用到。

其中前两个方法是我们需要做一些初始化的地方,只在启动时调用,而后面的BecomeActive方法会因程序中断和前后台切换多次调用到。

对于一个简单的应用,初始化主要做的事情就是把View和Controller初始化并结合起来。此外,必要的情况下还要对传入的Options参数进行解析处理,构建必要的数据结构。而按照官方文档的要求,整个启动过程需要在5秒钟内完成,否则应用进程会因无响应的原因被kill掉。因此,如果有其它任务需要执行,则应该开启主线程之外的线程来进行,或者是推迟到之后更合适的实际来进行。

应用程序也有启动后直接进入后台运作的,这个可以参看苹果官方文档说明。

3. 前台运行的ActiveInactive

在介绍iOS应用状态5种最基本的状态时,我们发现前台运行有两种状态,分别是Inactive和Active状态。大多数情况下,Inactive状态只是其它状态之间切换时短暂的停留状态,如前后台应用切换时,Inactive状态会在Active和Background之间短暂出现。

但也有一些其它情况,Active和Inactive可以在前台运行时互相切换,比如当一个应用安装运行后第一次尝试使用GPS定位,需要获取用户的允许,给出系统的Alert提示,这时应用会从Active切换到Inactive,直到用户确认后再返回Active。再如,用户在应用运行时从状态条向下拉出通知页,也会发生Active和Inactive状态的切换。此外,还有来电/拒绝接听,以及App Switcher/回到原应用的操作等,都不进入Backgroud状态,而只在Active与Inactive之间切换。

也就是说通常情况下,应用程序启动,图中的三个方法会被依次调用到。

其中前两个方法是我们需要做一些初始化的地方,只在启动时调用,而后面的BecomeActive方法会因程序中断和前后台切换多次调用到。

对于一个简单的应用,初始化主要做的事情就是把View和Controller初始化并结合起来。此外,必要的情况下还要对传入的Options参数进行解析处理,构建必要的数据结构。而按照官方文档的要求,整个启动过程需要在5秒钟内完成,否则应用进程会因无响应的原因被kill掉。因此,如果有其它任务需要执行,则应该开启主线程之外的线程来进行,或者是推迟到之后更合适的实际来进行。

应用程序也有启动后直接进入后台运作的,这个可以参看苹果官方文档说明。

原文地址:http://www.molotang.com/articles/1254.html

时间: 2024-12-30 18:35:58

转 iOS应用程序的状态及其切换(生命周期)的相关文章

Cocos2d-x Lua中多场景切换生命周期

在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期.多个场景切换时候分为几种情况:情况1,使用pushScene函数从实现GameScene场景进入SettingScene场景.情况2,使用replaceScene函数实现从GameScene场景进入SettingScene场景.情况3,使用popScene函数从实现SettingScene场景回到GameScene场景.我们参考GameScene重写SettingScene的中几个生命周期函数,代码如下: func

Cocos2d-x多场景切换生命周期

在多个场景切换时候场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况 情况1使用pushScene函数从实现HelloWorld场景进入Setting场景. 情况2使用replaceScene函数实现从HelloWorld场景进入Setting场景. 情况3使用popScene函数从实现Setting场景回到HelloWorld场景.   我们参考HelloWorld重写Setting层的中几个生命周期函数代码如下 bool Setting::init(

Android横竖屏切换生命周期调用过程

问题描述 今天想熟悉下Android生命周期,尤其是横竖屏切换生命周期的调用过程.但是发现了一个问题:android4.0的切换效果:android2.2的切换效果:求解,Android从哪个版本开始,横竖屏切换效果开始改变.应该不是我的环境的问题吧. 解决方案 解决方案二:是说2.2调用的是onconfigurationchsnged吗?这不是你的环境问题,我不清楚以前版本是怎样的,但是在我看官方文档的时候它就是你说的4.0版本的那个样子了,也就是说,在横竖切换的时候会销毁原来的实例再重建.参

Android横竖屏幕切换生命周期详解

一.简介 二.代码 /activityLifeCycle_3Screen/AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.fry.activityLifeCycle_3Screen" android:versionCode="1" android:versionName="1.

Android Activity 横竖屏切换的生命周期_Android

前言 在开发中常要处理横竖屏切换,怎么处理先看生命周期 申明 Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下 onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据 横竖屏切换生命周期 1.启动程

Android的Fragment的生命周期各状态和回调函数使用_Android

回调函数 就像activities一样,fragments也有它们自己的生命周期.理解fragments的生命周期,可以使你在它们被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态. 流程: onAttach() 作用:fragment已经关联到activity,     这个是 回调函数 @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.i("onAtt

怀疑论者的JSF: JSF应用程序的生命周期

与很多流行的观点不同,我们无需了解技术工作原理的所有细节,就可以编写 JSF 应用 程序.您只需要给自己设置一个项目,并从头到尾不断修修补补,这样就可以学习到大量的 知识.另一方面,理解必要的基础知识可以使您的开发工作更加有效 -- 而且会节省很多 时间. 在本系列 怀疑论者的 JSF 的第 2 篇文章中,我们将逐一介绍一下 JSF 请求处理生命周 期的 5 个阶段.我们将介绍在每个阶段中会发生什么,以及这些阶段是如何相互连接在一起 的,然后使用一个示例程序来展示实际的生命周期.随着学习的深入,

《iOS创意程序设计家》——第6.4节事件检测

6.4 事件检测 iOS创意程序设计家 界面控制器除了负责界面的管理以及布局外,还负责事件的传递.这些事件包括我们在第5章已经介绍过的触控事件,还有接下来要介绍的晃动检测事件.这些事件都定义在UIResponder类里面,而无论是界面控制器UIViewController还是界面UIView,它们都继承自UIResponder类. 6.4.1 晃动检测 首先,我们来看看晃动事件的处理.与触控事件类似的是,晃动检测也是由一连串的事件所组成的,不过,要让您的应用程序支持晃动检测,必须让您的界面控制器

深度解析~iOS应用程序~生命周期

摘要:iOS应用程序一般都是由自己编写的代码和系统框架组成,系统框架提供一些基本infrastructure给App来运行,而开发者则自己编写代码定制App的外观和行为,了解iOS Infrastructure及其如何工作对编写App很有帮助. iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有App来运行,而你提供自己编写的代码来定制App的外观和行为.因此,了解iOS Infrastructure