設(shè)備運(yùn)行的五種狀態(tài)
Not running 程序未啟動(dòng) 或者已經(jīng)被殺死
Inactive 當(dāng)前應(yīng)用正在前臺(tái)運(yùn)行眠屎,但是并不接收事件 中途過(guò)渡會(huì)短暫停留在此狀態(tài)。唯一在此狀態(tài)停留時(shí)間比較長(zhǎng)的情況是:當(dāng)用戶鎖屏?xí)r火窒,或者系統(tǒng)提示用戶去響應(yīng)某些(諸如電話來(lái)電、有未讀短信等)事件的時(shí)候
Active 當(dāng)前應(yīng)用正在前臺(tái)運(yùn)行魏割,并且接收事件 即App在線
Suspended 應(yīng)用處在后臺(tái)廊勃,并且已停止執(zhí)行代碼 另一稱(chēng)呼為掛起狀態(tài),APP依然處在系統(tǒng)內(nèi)存中搬男,當(dāng)系統(tǒng)發(fā)出低內(nèi)存警告時(shí)拣展,會(huì)殺死這個(gè)進(jìn)程以保證其他的前臺(tái)應(yīng)用正常運(yùn)行,我們要做的也就是防止app被掛起 從而能夠進(jìn)入后臺(tái)模式
Background 應(yīng)用處在后臺(tái)缔逛,并且還在執(zhí)行代碼备埃。一般的應(yīng)用,會(huì)在此狀態(tài)停留10分鐘, 而iOS為了在某些情況下提供更好的體驗(yàn)褐奴,提供了一些選項(xiàng)按脚,滿足這些選項(xiàng)就可以在后臺(tái)運(yùn)行很長(zhǎng)一段時(shí)間
應(yīng)用程序生命周期
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"\n ===> 程序啟動(dòng) !");
return YES;
}
// 當(dāng)有電話進(jìn)來(lái)或者鎖屏,這時(shí)你的應(yīng)用程會(huì)掛起 你可以重寫(xiě)這個(gè)方法歉糜,做掛起前的工作乘寒,比如關(guān)閉網(wǎng)絡(luò),保存數(shù)據(jù)
// 游戲應(yīng)該用這個(gè)方法暫停游戲
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"\n ===> 程序暫行 !");
}
/*
用這個(gè)方法來(lái)釋放共享資源,保存用戶數(shù)據(jù),銷(xiāo)毀計(jì)時(shí)器,并儲(chǔ)存足夠的應(yīng)用程序狀態(tài)信息來(lái)恢復(fù)您的應(yīng)用程序的當(dāng)前狀態(tài)
如果您的應(yīng)用程序支持后臺(tái)執(zhí)行匪补,這種方法被稱(chēng)為替代applicationWillTerminate:當(dāng)用戶退出
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"\n ===> 程序進(jìn)入后臺(tái) !");
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"\n ===> 程序進(jìn)入前臺(tái) !");
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"\n ===> 程序重新激活 !");
}
/*
當(dāng)用戶按下按鈕伞辛,或者關(guān)機(jī)烂翰,程序都會(huì)被終止。當(dāng)一個(gè)程序?qū)⒁=K止時(shí)會(huì)調(diào)用 applicationWillTerminate 方法蚤氏。但是如果長(zhǎng)主按鈕強(qiáng)制退出甘耿,則不會(huì)調(diào)用該方法。這個(gè)方法該執(zhí)行剩下的清理工作竿滨,比如所有的連接都能正常關(guān)閉佳恬,并在程序退出前執(zhí)行任何其他的必要的工作
殺死程序
*/
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"\n ===> 程序被kill!");
}
向系統(tǒng)借10分鐘后臺(tái)運(yùn)行時(shí)間
1.借條
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
/**
* 借條
*/
@property (nonatomic, unsafe_unretained)UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@end
2.10分鐘內(nèi)需要做的事
- (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 ===> 程序啟動(dòng) !");
}
return YES;
}
- (void)print
{
NSLog(@"更新時(shí)間");
}
3.時(shí)間到了之后應(yīng)該做的事
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"\n ===> 程序進(jìn)入后臺(tái) !");
self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
// 當(dāng)應(yīng)用程序留給后臺(tái)的時(shí)間快要到結(jié)束時(shí) 這個(gè)Block塊將被執(zhí)行
[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];// 停止定時(shí)器
// 標(biāo)記指定的后臺(tái)任務(wù)完成
[[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
// 銷(xiāo)毀后臺(tái)任務(wù)標(biāo)識(shí)符
strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
});
}