【代碼筆記】後臺運行,可以選擇在前臺或後臺或前後臺

来源:http://www.cnblogs.com/yang-guang-girl/archive/2016/03/18/5290732.html
-Advertisement-
Play Games

一,工程圖。 二,代碼。 AppDelegate.h AppDelegate.m RootViewController.h RootViewController.m


一,工程圖。

二,代碼。

AppDelegate.h

AppDelegate.m

RootViewController.h

複製代碼
#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@property (nonatomic, strong) NSTimer *myTimer;

@end
複製代碼

 

RootViewController.m

複製代碼
#import "AppDelegate.h"
#import "RootViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    
    RootViewController *rootVC=[[RootViewController alloc]init];
    UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:rootVC];
    self.window.rootViewController=nav;
    
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    
    
    // 使用這個方法來釋放公共的資源、存儲用戶數據、停止我們定義的定時器(timers)、並且存儲在程式終止前的相關信息。
    // 如果,我們的應用程式提供了後臺執行的方法,那麼,在程式退出時,這個方法將代替applicationWillTerminate方法的執行。
    
    
    // 標記一個長時間運行的後臺任務將開始
    // 通過調試,發現,iOS給了我們額外的10分鐘(600s)來執行這個任務。
    self.backgroundTaskIdentifier =[application beginBackgroundTaskWithExpirationHandler:^(void) {
        
        // 當應用程式留給後臺的時間快要到結束時(應用程式留給後臺執行的時間是有限的), 這個Block塊將被執行
        // 我們需要在次Block塊中執行一些清理工作。
        // 如果清理工作失敗了,那麼將導致程式掛掉
        
        // 清理工作需要在主線程中用同步的方式來進行
        [self endBackgroundTask];
    }];
    
    // 模擬一個Long-Running Task
    self.myTimer =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                   target:self
                                                 selector:@selector(timerMethod:)     userInfo:nil
                                                  repeats:YES];
    

}

- (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];// 停止定時器
            
            // 每個對 beginBackgroundTaskWithExpirationHandler:方法的調用,必須要相應的調用 endBackgroundTask:方法。這樣,來告訴應用程式你已經執行完成了。
            // 也就是說,我們向 iOS 要更多時間來完成一個任務,那麼我們必須告訴 iOS 你什麼時候能完成那個任務。
            // 也就是要告訴應用程式:“好借好還”嘛。
            // 標記指定的後臺任務完成
            [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
            // 銷毀後臺任務標識符
            strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    });
}

// 模擬的一個 Long-Running Task 方法
- (void) timerMethod:(NSTimer *)paramSender{
    // backgroundTimeRemaining 屬性包含了程式留給的我們的時間
    NSTimeInterval backgroundTimeRemaining =[[UIApplication sharedApplication] backgroundTimeRemaining];
    
    if (backgroundTimeRemaining == DBL_MAX){
        //前臺列印
        NSLog(@"Background Time Remaining = Undetermined");
    } else {
        //後臺列印
        NSLog(@"Background Time Remaining = %.02f Seconds", backgroundTimeRemaining);
    }
}


- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    
    //添加此段代碼,則在前臺就不運行了。否則會前後臺一起運行。除第一次啟動的時候,是前臺不運行,退出後臺時候運行。
    
    if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid){
        [self endBackgroundTask];
    }
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end
複製代碼

 

 

   
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • html垂直居中
  • 用原生js寫了一個超級簡單的日曆。當做是練習js中的Date類型。 思路: html css js 效果圖:
  • DIV顯示內容有時會超長,並把頁面撐的很難看, 以前的做法是在JS中,或者後臺判斷其長度,過長就截斷, 但由於中英文數字展示的寬度並不一樣,截斷的長度也就只能取最小值, 展示的效果也不好。利用CSS提供的方法,可以完美的解決該問題。 這裡寬度是必須定義的,
  • canvas 元素使用 JavaScript 在網頁上繪製圖像,本身是沒有繪圖能力。 canvas 是一個矩形區域,可以控制其每一像素。 canvas 擁有多種繪製路徑、矩形、圓形、字元以及添加圖像的方法。 下麵來做幾個示例: 1、填充畫布 <canvas id="myCanvas" width="
  • Direction: up, down, left, right scrollamount:滾動速度,單位像素 loop: -1無限迴圈
  • 環境描述 前端:jsp 後端:SpringMVC Controller 儘管jsp頁面已設置了pageEncoding: 然後在控制器中,讀取到的對應參數如果含有中文,則出現亂碼,例如: public ModelAndView search(@RequestParam("keyword") Stri...
  • 基於 Material Design 的 BiliBili 第三方 Android 客戶端,我們知道這個APP目前比較流行,所以大家也比較喜歡模仿,需要的參考一下 文檔共用 : https://drive.google.com/folderview?id=0B5Izr6QMl6WhflNwY3MyZ
  • 高仿餓了麽界面效果,動畫效果還是不錯滴,分享給大家一下。 源碼下載:http://code.662p.com/list/11_1.html <ignore_js_op> 詳細說明:http://android.662p.com/thread-6472-1-1.html
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...