关于ios 退到后台,再进入前台的一些问题
当app进入后台,app处于挂起状态,默认程序会可以执行大约5s的样子
场景一:计时器显示会快速的闪一下
app有定时器,当app进入后台,定时器将会暂停(是暂停),当app进入前台,定时器会继续运行(是继续,不是重新开始)。当界面中有一个计时器显示(比如一个lable展示当前还剩多长时间),当app进入后台,再切换至前台(这两次操作在5s内完成),你会发现label显示的时间会快速的闪一下,这就是由于挂起后,程序还在执行造成的,当app真正挂起之后,再重新进入前台,label 显示的时间会继续走。
场景二,需要app从后台进入前台显示特定页面
从app进入后台,app的程序一直是暂停,并没有被真正的杀死(如果是杀死,那么你就会看见app重载,是操作系统自己处理的),app再从后台进入前台,ios系统有个状态恢复功能,所以会出现,咱们当时退入后台时的界面,现在我需要app进入前台展示广告页.
1、需要AppDelegate中实现app进入后台调用的方法:
- (void)applicationDidEnterBackground:(UIApplication *)application {
addViewController *Add = [addViewController new];
self.window.rootViewController = Add;
}
2、不要在app进入前台调用的方法里添加,会出现画面切换的动作(这不是我们想要看到的)
- (void)applicationWillEnterForeground:(UIApplication *)application {
不要在这里做处理!!!
}
场景三,我们需要在app退到后台,不幸的被kill了,那么在点击app将会重载,想要展示用户上次操作的页面
ios 给我们提供了 Restoration ID(恢复标识)
操作步骤:在IB的Scene中选中View Controller,打开右边的标识检查器,设置Restoration ID(恢复标识)为viewController。
可能未使用xib或者Storyboard,那么需要支持恢复的类中实现一些方法,基本原则如下:
1)类要遵循UIViewControllerRestoration协议;
2)实现viewControllerWithRestorationIdentifierPath方法
3)设置自己的·restorationIdentifier和restorationClass,例如:
self.restorationIdentifier=@"AnyIdentifier";
self.restorationClass= [self class];
1、需要AppDelegate中实现两个方法:
-(BOOL) application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
return YES;
}
-(BOOL) application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
return YES;
}
- (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder
{
[coder encodeFloat:2.0 forKey:@"Version"];
}
- (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder
{
float lastVer = [coder decodeFloatForKey:@"Version"];
NSLog(@"lastVer = %f",lastVer);
}
其中application:shouldSaveApplicationState:在应用退出的时候调用,负责控制是否允许保存状态,返回YES情况是可以保存,NO是不保存。
application:shouldRestoreApplicationState:是应用启动时候调用,负责控制是否恢复上次退出的时候的状态,返回YES情况是可以恢复,NO是不恢复。
application:willEncodeRestorableStateWithCoder:方法是保存时候调用,在这个方法中实现UI状态或数据的保存,其中[coder encodeFloat:2.0 forKey:@"Version"]是保存简单数据。
application:didDecodeRestorableStateWithCoder:方法是恢复时候调用,在这个方法中实现UI状态或数据的恢复,其中[coder decodeFloatForKey:@"Version"]语句是恢复上次保存的数据。
3、以上的操作只能保证当程序从后台返回到前台的时候对应的能够恢复到对应的页面,具体想恢复子控件subView的状态恢复还需要实现以下方法:
- (void)encodeRestorableStateWithCoder:(NSCoder*)coder
{
//[coderencodeObject:AnyObjectforKey:@“AnyKey"];
[superencodeRestorableStateWithCoder:coder];
}
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder
{
//AnyObject= [coderdecodeObjectForKey:@“AnyKey"];
[superdecodeRestorableStateWithCoder:coder];
}
没有用的!!!
补充:当app进入后台,系统会把屏幕视图截屏,保存在/AppData/Library/Caches/Snapshots/appbunleID下.ktx格式的文件,启动图也在这里保存着