设备运行的五种状态
Not running 程序未启动 或者已经被杀死
Inactive 当前应用正在前台运行,但是并不接收事件 中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候
Active 当前应用正在前台运行,并且接收事件 即App在线
Suspended 应用处在后台,并且已停止执行代码 另一称呼为挂起状态,APP依然处在系统内存中,当系统发出低内存警告时,会杀死这个进程以保证其他的前台应用正常运行,我们要做的也就是防止app被挂起 从而能够进入后台模式
Background 应用处在后台,并且还在执行代码。一般的应用,会在此状态停留10分钟, 而iOS为了在某些情况下提供更好的体验,提供了一些选项,满足这些选项就可以在后台运行很长一段时间
Paste_Image.png
应用程序生命周期
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"\n ===> 程序启动 !");
return YES;
}
// 当有电话进来或者锁屏,这时你的应用程会挂起 你可以重写这个方法,做挂起前的工作,比如关闭网络,保存数据
// 游戏应该用这个方法暂停游戏
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"\n ===> 程序暂行 !");
}
/*
用这个方法来释放共享资源,保存用户数据,销毁计时器,并储存足够的应用程序状态信息来恢复您的应用程序的当前状态
如果您的应用程序支持后台执行,这种方法被称为替代applicationWillTerminate:当用户退出
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"\n ===> 程序进入后台 !");
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"\n ===> 程序进入前台 !");
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"\n ===> 程序重新激活 !");
}
/*
当用户按下按钮,或者关机,程序都会被终止。当一个程序将要正常终止时会调用 applicationWillTerminate 方法。但是如果长主按钮强制退出,则不会调用该方法。这个方法该执行剩下的清理工作,比如所有的连接都能正常关闭,并在程序退出前执行任何其他的必要的工作
杀死程序
*/
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"\n ===> 程序被kill!");
}
向系统借10分钟后台运行时间
1.借条
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
/**
* 借条
*/
@property (nonatomic, unsafe_unretained)UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@end
2.10分钟内需要做的事
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([self isMultitaskingSupported]) {
self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(print) userInfo:nil repeats:YES];
NSLog(@"\n ===> 程序启动 !");
}
return YES;
}
- (void)print
{
NSLog(@"更新时间");
}
3.时间到了之后应该做的事
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"\n ===> 程序进入后台 !");
self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
// 当应用程序留给后台的时间快要到结束时 这个Block块将被执行
[self endBackgroundTask];
}];
}
- (void) endBackgroundTask{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
AppDelegate *weakSelf = self;
dispatch_async(mainQueue, ^(void) {
AppDelegate *strongSelf = weakSelf;
if (strongSelf != nil)
{
[strongSelf.myTimer invalidate];// 停止定时器
// 标记指定的后台任务完成
[[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
// 销毁后台任务标识符
strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
});
}