後臺執行

weixin_34236497發表於2016-12-30

裝置執行的五種狀態

Not running 程式未啟動 或者已經被殺死
Inactive 當前應用正在前臺執行,但是並不接收事件 中途過渡會短暫停留在此狀態。唯一在此狀態停留時間比較長的情況是:當使用者鎖屏時,或者系統提示使用者去響應某些(諸如電話來電、有未讀簡訊等)事件的時候
Active 當前應用正在前臺執行,並且接收事件 即App線上
Suspended 應用處在後臺,並且已停止執行程式碼 另一稱呼為掛起狀態,APP依然處在系統記憶體中,當系統發出低記憶體警告時,會殺死這個程式以保證其他的前臺應用正常執行,我們要做的也就是防止app被掛起 從而能夠進入後臺模式
Background 應用處在後臺,並且還在執行程式碼。一般的應用,會在此狀態停留10分鐘, 而iOS為了在某些情況下提供更好的體驗,提供了一些選項,滿足這些選項就可以在後臺執行很長一段時間

694556-f4af59576be312f9.png
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;
        }
    });
    
}

相關文章