關(guān)于ios 退到后臺,再進(jìn)入前臺的一些問題

當(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格式的文件,啟動圖也在這里保存著

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容