面对每次打开
iOS
应用时.都是否想到过其App
运行过程:从启动到按Home
键回到主屏幕,从运行中到按两下Home
键进入任务管理界面,甚至iOS9
后支持多任务的iPad
当两个App
出现在同一屏幕上,这几个情况App所处于什么状态.其过渡中又在进行怎样的状态切换呢,Let's get it !!! 😎
App状态变化的历史
在iOS4
之前的App时代,整个界面只允许一个App处于运行状态,而当某个App处于运行状态时意味着其他所有的App的活动都被终止并退出,无法接受任何事件.一个应用的状态转换只有运行、退出之间的变换.在iOS4
之后的iPhone进入了多任务处理时代.也意味了当从一个应用切换到另一个应用时,系统不会马上将原来的应用终止退出,将其状态变成了suspend
,而另一个应用的状态变成了running
.
AppDelegate
运行一个App,应用程序会自动创建UIApplication
单例对象,并用于引用着,其UIApplicaiton
实例的delegate
被赋值为AppDelegate
实例对象,其也是一个单例,也永远不会被释放直到该App退出.而AppDelegate
对象有着一系列在程序启动时的跟踪状态变化,处理从其他应用跳转、启动到此应用,或者后台运行代码的方法.以下是AppDelegate
做为App的根对象的主要功能:
- 运行在启动时自己用来初始化应用的特点代码.
- 响应App从启动,到后台,到前台,到退出时各个状态时的指定方法.
- 负责处理接收推送通知或本地通知启动App的情况,处理手机低内存警告时的情况.
- 负责处理应用程序的状态保存和恢复.
- 响应由
App
处理的事件,而是指定控制器或视图. - 处理数据的存储.
App状态的代理事件
新建一个Signle View Application
后,系统会自动创建AppDelegate
文件,系统默认提供的方法表示了App不同的运行状态.
-
application:willFinishLaunchingWithOptions
在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复 -
application:didFinishLaunchingWithOptions
表示App将从未运行状态进入运行状态,用于对App的初始化操作. -
applicationDidBecomeActive
在application:didFinishLaunchingWithOptions:
之后调用,表示应用进入active
状态,在applicationWillResignActive
调用后App又回到active
状态时也会调用. -
applicationWillResignActive
当某一操作阻塞App界面时会调用,如按Home键回到键入主界面,划出通知栏或者设置,临时的电话和通知,支持多任务的iPad进行侧边栏滑动时等情况下都会调用,使得App进入inavtive
状态,往往操作结束后会调用applicationDidBecomeActive
,使得App回到active
状态. -
applicationDidEnterBackground
在App进入后台后调用,之前肯定会调用applicationWillResignActive
方法.允许执行短时间 的任务代码如清理内存 -
applicationWillEnterForeground
当App将从后台回到前台时调用,之后肯定调用applicationDidBecomeActive
方法表示程序进入active
状态,但App第一次启动时不是从后台启动,所以首次加载时不会调用此方法. -
applicationWillTerminate
当App将要被系统杀死时调用,通常用来对App进行清理工作,释放资源,保存数据等等,所执行的操作官方推荐最多耗时5s左右的事件来完成和返回,若时间过长系统杀死应用时会将使操作失败.其调用时机比较特殊,如果运行的App直接退出(非进入后台),会调用;若应用是从中断状态(此状态期间App无法接收任何事件)被系统退出,则不会被调用.
注意点
iOS8中,App会在根控制器初始化后调用viewDidAppear
方法之后才会调用applicationDidBecomeActive
,对于App启动的事件顺序为
application:didFinishLaunchingWithOptions:
⬇️
viewDidLoad
⬇️
viewWillAppear
⬇️
viewDidAppear
⬇️
applicationDidBecomeActive
而在iOS7和9中,App在调用applicationDidBecomeActive
方法后才会调用根控制器的viewDidAppear
,其调用顺序为
application:didFinishLaunchingWithOptions:
⬇️
viewDidLoad
⬇️
viewWillAppear
⬇️
applicationDidBecomeActive
⬇️
viewDidAppear
在这两情况下如果要对UIApplicationDidBecomeActiveNotification
进行通知注册时就需要考虑其iOS的兼容性,否则就会出现问题了.