对于iOS开发者来说,了解应用程序在前台和后台之间的状态切换是很有必要的。在了解切换之前,我们应该先大致了解下应用程序有哪几种状态。
-
应用程序的状态
程序的五种状态:
State | 状态 | 描述 |
---|---|---|
Not running | 未运行 | 程序没启动 |
Inactive | 未激活 | 程序在前台运行,但没有接收到事件。在没有事件处理情况下程序通常停留在这个状态 |
Active | 激活 | 程序在前台运行,并且接收到了事件。这也是前台的一个正常的模式 |
Backgroud | 后台 | 程序在后台,并且能执行代码。大多数程序进入这个状态后会在这个状态上停留一会,但到一定时间之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态 |
Suspended | 挂起 | 程序在后台,不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,但当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存 |
-
UIApplicationDelegate协议方法
1.各个程序运行状态时代理的回调:
- application:willFinishLaunchingWithOptions:
该方法是程序启动,但还没进入状态保存时执行。
- application:didFinishLaunchingWithOptions:
该方法是程序启动基本完成,准备开始运行时执行。
- applicationDidFinishLaunching:
该方法在应用程序中不需要用到,用上面那两个方法所代替了。
- applicationDidBecomeActive:
该方法是程序进入活动状态时执行。
- applicationWillResignActive:
该方法是当程序将要进入非活动状态时执行,在此期间,应用程序不接收消息或事件,比如按下Home键或者来电话了。
- applicationDidEnterBackground:
该方法是当程序被推送到后台时执行。
- applicationWillEnterForeground:
该方法是当程序从后台将要重新回到前台是执行。
- applicationWillTerminate:
该方法是程序将要推出时执行,通常是用来保存数据和一些退出前的清理工作。
2.几种对程序进行操作时,各个方法的执行顺序
a. 第一次启动程序:
-application:willFinishLaunchingWithOptions:
-applicationDidFinishLaunching:
-applicationDidBecomeActive:
b. 按下Home键:
-applicationWillResignActive:
-applicationDidEnterBackground:
c. 从后台启动程序:
-applicationWillEnterForeground:
-applicationDidBecomeActive:
d. 双击Home键,然后退出程序:
-applicationWillResignActive:
-applicationDidEnterBackground:
-applicationWillTerminate:
-
UIApplicationDelegate对应的通知方法
UIApplicationDelegate的协议方法分别对应相应的通知:
UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification;
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification;
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification;
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification;
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification;
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification;
UIKIT_EXTERN NSString *const UIApplicationWillTerminateNotification;
在此,我贴心的列举一下使用方法:
// 自己实现 enterBackground 方法就OK了
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
贴心小提示:添加了通知,在不用的时候记得要 remove 哦!
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
本人觉得这种通知方法的好处在于,当某个类在状态切换时需要做处理的时候,在当前类中添加通知即可,省的每次做处理都要跑到AppDelegate类中。
网友评论