當(dāng)app進(jìn)入后臺,app處于掛起狀態(tài),默認(rèn)程序會可以執(zhí)行大約5s的樣子
場景一:計(jì)時(shí)器顯示會快速的閃一下
? ? ?app有定時(shí)器,當(dāng)app進(jìn)入后臺,定時(shí)器將會暫停(是暫停),當(dāng)app進(jìn)入前臺,定時(shí)器會繼續(xù)運(yùn)行(是繼續(xù),不是重新開始)。當(dāng)界面中有一個(gè)計(jì)時(shí)器顯示(比如一個(gè)lable展示當(dāng)前還剩多長時(shí)間),當(dāng)app進(jìn)入后臺,再切換至前臺(這兩次操作在5s內(nèi)完成),你會發(fā)現(xiàn)label顯示的時(shí)間會快速的閃一下,這就是由于掛起后,程序還在執(zhí)行造成的,當(dāng)app真正掛起之后,再重新進(jìn)入前臺,label 顯示的時(shí)間會繼續(xù)走。
場景二,需要app從后臺進(jìn)入前臺顯示特定頁面
? ? ? 從app進(jìn)入后臺,app的程序一直是暫停,并沒有被真正的殺死(如果是殺死,那么你就會看見app重載,是操作系統(tǒng)自己處理的),app再從后臺進(jìn)入前臺,ios系統(tǒng)有個(gè)狀態(tài)恢復(fù)功能,所以會出現(xiàn),咱們當(dāng)時(shí)退入后臺時(shí)的界面,現(xiàn)在我需要app進(jìn)入前臺展示廣告頁.
1、需要AppDelegate中實(shí)現(xiàn)app進(jìn)入后臺調(diào)用的方法:
- (void)applicationDidEnterBackground:(UIApplication *)application {
addViewController *Add = [addViewController new];
self.window.rootViewController = Add;
}
2、不要在app進(jìn)入前臺調(diào)用的方法里添加,會出現(xiàn)畫面切換的動作(這不是我們想要看到的)
- (void)applicationWillEnterForeground:(UIApplication *)application {
不要在這里做處理!??!
}
場景三,我們需要在app退到后臺,不幸的被kill了,那么在點(diǎn)擊app將會重載,想要展示用戶上次操作的頁面
ios 給我們提供了?Restoration ID(恢復(fù)標(biāo)識)
操作步驟:在IB的Scene中選中View Controller,打開右邊的標(biāo)識檢查器,設(shè)置Restoration ID(恢復(fù)標(biāo)識)為viewController。
? ? ? ? ? ? ? ? ? 可能未使用xib或者Storyboard,那么需要支持恢復(fù)的類中實(shí)現(xiàn)一些方法,基本原則如下:
1)類要遵循UIViewControllerRestoration協(xié)議;
2)實(shí)現(xiàn)viewControllerWithRestorationIdentifierPath方法
3)設(shè)置自己的·restorationIdentifier和restorationClass,例如:
self.restorationIdentifier=@"AnyIdentifier";
self.restorationClass= [self class];
1、需要AppDelegate中實(shí)現(xiàn)兩個(gè)方法:
-(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:在應(yīng)用退出的時(shí)候調(diào)用,負(fù)責(zé)控制是否允許保存狀態(tài),返回YES情況是可以保存,NO是不保存。
application:shouldRestoreApplicationState:是應(yīng)用啟動時(shí)候調(diào)用,負(fù)責(zé)控制是否恢復(fù)上次退出的時(shí)候的狀態(tài),返回YES情況是可以恢復(fù),NO是不恢復(fù)。
application:willEncodeRestorableStateWithCoder:方法是保存時(shí)候調(diào)用,在這個(gè)方法中實(shí)現(xiàn)UI狀態(tài)或數(shù)據(jù)的保存,其中[coder encodeFloat:2.0 forKey:@"Version"]是保存簡單數(shù)據(jù)。
application:didDecodeRestorableStateWithCoder:方法是恢復(fù)時(shí)候調(diào)用,在這個(gè)方法中實(shí)現(xiàn)UI狀態(tài)或數(shù)據(jù)的恢復(fù),其中[coder decodeFloatForKey:@"Version"]語句是恢復(fù)上次保存的數(shù)據(jù)。
3、以上的操作只能保證當(dāng)程序從后臺返回到前臺的時(shí)候?qū)?yīng)的能夠恢復(fù)到對應(yīng)的頁面,具體想恢復(fù)子控件subView的狀態(tài)恢復(fù)還需要實(shí)現(xiàn)以下方法:
- (void)encodeRestorableStateWithCoder:(NSCoder*)coder
{
//[coderencodeObject:AnyObjectforKey:@“AnyKey"];
[superencodeRestorableStateWithCoder:coder];
}
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder
{
//AnyObject= [coderdecodeObjectForKey:@“AnyKey"];
[superdecodeRestorableStateWithCoder:coder];
}
沒有用的?。。?/p>
補(bǔ)充:當(dāng)app進(jìn)入后臺,系統(tǒng)會把屏幕視圖截屏,保存在/AppData/Library/Caches/Snapshots/appbunleID下.ktx格式的文件,啟動圖也在這里保存著