文档章节

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

_子墨
 _子墨
发布于 2016/02/24 16:09
字数 1532
阅读 144
收藏 1

0. iOS应用入口和AppDelegate

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

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中对应的生命周期方法会被调用:

// 进程启动但还没完成初始化,这个方法是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方法会因程序中断和前后台切换多次调用到。

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

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

3. 前台运行的ActiveInactive

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

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

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

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

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

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


本文转载自:http://www.molotang.com/articles/1254.html

_子墨
粉丝 48
博文 157
码字总数 141425
作品 0
深圳
iOS工程师
私信 提问
Structure & Lifecycle (应用结构和生命周期)

一、应用程序结构 Windows phone 8应用程序目录包括Properties文件夹、References文件夹、Assets文件夹、Resources文件夹、App.xaml、LocalizedStrings.cs、MainPage.xaml。 Properties文件夹...

失足处男的倒霉孩子
2013/12/24
348
0
iOS应用程序的窗口元素及其运行原理

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

开发小菜鸟一枚
2013/11/06
592
0
Xamarin iOS教程之编辑界面编写代码

Xamarin iOS教程之编辑界面编写代码 Xamarin iOS的Interface Builder Interface Builder被称为编辑界面。它是一个虚拟的图形化设计工具,用来为iOS应用程序创建图形界面。单击MainStoryboar...

大学霸
2015/06/11
237
0
iOS学习笔记:iOS应用程序的窗口元素及其运行原理

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

寂无声
2013/11/03
676
0
iOS 6.0旋转兼容的那点事

这两天问答系统里,问ios横竖屏切换、还有状态栏旋转的问题有点多,来些小心得,希望遇到的人少走弯路; 先贴官方说明: iOS 6.0 Release Notes: Autorotation is changing in iOS 6. In iOS...

董桉远
2013/04/07
820
1

没有更多内容

加载失败,请刷新页面

加载更多

Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
28分钟前
5
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
33分钟前
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
39分钟前
4
0
Golang net/http处理表单请求

代码示范: package mainimport ("fmt""html/template""net/http")const tpl = `<html><head><title>Hey</title></head><body><form method="POST" action="/">......

听夜深窗外风
46分钟前
5
0
博客迁移 开源中国博客不再更新 之后考虑关停

博客迁移 开源中国博客不再更新 之后考虑关停 我的博客地址:blog.mrpei.cc

MrPei
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部