转 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方法会因程序中断和前后台切换多次调用到。

对于一个简单的应用,初始化主要做的事情就是把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掉。因此,如果有其它任务需要执行,则应该开启主线程之外的线程来进行,或者是推迟到之后更合适的实际来进行。

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

目录
相关文章
|
29天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
117 4
|
2月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
2月前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
77 1
|
4月前
|
搜索推荐 API 开发工具
打造个性化天气应用:从零开始的iOS开发之旅
【8月更文挑战第31天】本文是一篇针对初学者的iOS应用开发指南,将引导读者通过Swift和iOS SDK构建一个简单而美观的天气应用。我们将探索如何利用API获取实时天气数据,并在应用中实现用户友好的界面设计。文章不仅包括代码示例,还提供了设计理念和用户体验优化的建议,旨在帮助初学者理解iOS开发的基础知识,并激发他们创造个性化应用的兴趣。
|
1月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
30 2
|
1月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
57 1
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
61 5
|
2月前
|
移动开发 前端开发 Swift
iOS 最好的应用程序开发编程语言竟然是这7种
iOS 最好的应用程序开发编程语言竟然是这7种
113 8
|
3月前
|
存储 IDE 开发工具
移动应用开发之旅:打造你的首个iOS应用
【9月更文挑战第23天】在数字化浪潮中,移动应用已成为连接用户与数字世界的关键桥梁。本文将带领读者踏上开发属于自己的第一个iOS移动应用的旅程,从理解移动操作系统的核心概念出发,逐步深入到实际的应用构建过程中。通过简洁明了的语言和具体的代码示例,我们将一起探索如何在苹果的iOS平台上实现一个简单的“待办事项列表”应用,让读者不仅能够学习到编程知识,还能体会到将想法转化为现实产品的成就感。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一个实用的指南,帮助你迈出成为移动应用开发者的第一步。