你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS後台運行機制 與 動作

IOS後台運行機制 與 動作

編輯:IOS開發綜合
當用戶按下"Home"鍵或者系統啟動另外一個應用時,前台foreground應用首先切換到Inactive狀態,然後切換到Background狀態。此轉換將會導致先後調用應用代理的applicationWillResignActive:和applicationDidEnterBackground:方法。

  在applicationDidEnterBackground:方法返回後,大部分應用在之後不久轉入suspended狀態。對於請求特定後台background任務的應用,比如播放音樂應用,或者那些請求需要額外執行時間的應用,可能會繼續執行更長一段時間。

  具體流程如下圖所示:
  

152803ql5lq3s2j5xn5nzn.gif


  注:應用從froeground切換到background只有在支持多任務並且運行iOS4.0或更新版本系統的設備上才會發生。所有其它的情況,應用不是切向後台,而是直接終止,並且從內存中清除。

  應用切向後台background時應該做什麼:

  應用可以在applicationDidEnterBackground:方法中做些切向background狀態前需要做的一些准備工作,當切向background狀態時,所有的應用需要做以下事情:

  (1)應用界面快照。當applicationDidEnterBackground:方法返回時,系統保存應用界面的快照,並且使用快照圖片作為轉換動畫。如果在你的應用界面中有涉及到敏感信息的視圖,則你應該在applicationDidEnterBackground:方法返回前隱藏或者修改這些視圖。

  (2)保存用戶數據和應用狀態信息。所有沒有保存的改變都應該在切向background狀態前寫入磁盤以保存。這一步是必須的,因為你的應用在後台時很有可能因為多種其它原因而被很快kill掉。根據需要你可以在background thread後台線程中執行這些操作。

  (3)釋放盡可能多的內存資源。

  applicationDidEnterBackground:方法允許最多有5秒的時間去完成任何任務然後返回。實際中,此方法應該盡可能快的返回。如果在時間到期之後,此方法沒有返回,則應用即被kill掉,並且清除所占用的內存。如果你的應用確實需要更多的時間去執行任務,可以調用beginBackgroundTaskWithExpirationHandler:方法請求後台執行時間,然後啟動一個能長期執行任務的線程。無論你是否啟動一個執行後台任務的線程,applicationDidEnterBackground:方法都必須在5秒後退出。

  注:UIApplicationDidEnterBackgroundNotification通知也會發送,以讓應用對此通知感興趣的部分知道當前應用正切向background狀態。你的應用中的對象可以使用默認的通知中心注冊這個通知。

  依據不同的應用場合,應用切向後台時還有很多其它的事情需要做,比如active狀態的Bonjour服務應該暫停,應用應該停止調用OpenGL ES函數。

  因為前台應用在使用系統資源和硬件時一直比後台應用具有更高的優先權。運行在後台的應用應該對此差異有心理准備,並且在後台運行時要調整它們的訪問資源行為。特別的,當應用切向background時尤其要遵循以下幾點:

  (1)不要在應用代碼中調用任何OpenGL ES的東西。當應用在後台運行時不可以創建EAGLContext對象或者發出任何OpenGL ES繪畫命令,使用這些調用將會導致應用立即被kill掉。應用也必須保證先前提交發出的所有命令在應用切向background狀態前都已執行完畢。具體細節請參考“OpenGL ES Programming Guide for iOS”中“Implementing a Multitasking-aware OpenGL ES Application”部分。

  (2)在應用掛起suspended之前取消所有Bonjour相關的服務。當應用轉向後台,並且在被掛起前,應用應該unregister Bonjour服務並且關掉任何和網絡服務相關的sockets監聽。掛起的應用是沒法響應這些服務請求的。如果你的應用不關掉這些和Bonjour相關的服務,當應用被掛起的時候,系統會自動幫你關掉這些服務。

  (3)在基於網絡sockets的應用中,需要處理連接失敗的情況。當你的應用因為某些原因而被掛起時,系統可能會拆除socket連接。只要你的應用對盡可能多的網絡錯誤情況都有很好的處理,像丟掉信號等,此類問題不會導致你的應用出現不正常。當應用從後台退出恢復執行時,如果遇到sockets使用錯誤,簡單的重建socket連接即可。

  (4)在切向background狀態前保存應用狀態。在低內存告警時,後台應用可能會被清除出內存以釋放空間。處於suspended狀態的應用被優先清除內存,並且在被清除前不會給出任何通知。因此,當應用切入background狀態前一定要保存足夠多的應用狀態信息以便後面恢復時使用。

  (5)當切向後台時,釋放所有不再需要的內存。如果你的應用保持著一個很大的內存緩存對象(比如圖像),則切入後台前,釋放所有的對這些緩存對象的引用。

  (6)在被掛起前停止使用系統共享資源。使用系統共享資源(比如Address Book或Calendar Data)的應用,在被掛起前必須停止對這些共享資源的使用。對這些資源的使用,前台應用具有更高的優先使用權,如果發現你的應用在被掛起後還沒有停止對這些共享資源的使用,則應該將被kill掉。

  (7)避免更新應用窗口和視圖。當應用處在後台時,應用窗口和視圖是不可見的,所以不需要更新它他。盡管在後台創建和操縱窗口和視圖對象並不會導致應用被kill掉,但是可以考慮將這些工作推遲到應用返回前台時執行。

  (8)響應外部附件連接和失去連接通知。針對和外部附件有通信的應用,當應用切向background狀態時,系統會發送一個disconnection通知。應用必須注冊此通知並且使用它去關掉當前的附件訪問session。當應用返回foreground時,會有一個與之匹配的通知被發送,給應用提供重新建立session的機會。

  (9)切向後台時,清除行為警告相關的資源。為了在應用相互切換之間保存應用上下文,當應用切向後台時,系統並不自動dismiss action sheets(UIActionSheet)和alert views(UIAlertView)。由應用設計者去提供具本的清除方案。對於運行在iOS4.0版本之前的應用,在退出時action sheets和alerts仍然被dismiss掉,以讓應用的取消處理函數有機會去運行。

  (10)切向後台時,移除所有敏感視圖信息。因為系統會快照應用界面並且生成應用切換動畫,所以帶有敏感信息的視圖或窗口必須隱藏或移除,具體原因前面已介紹。

  (11)應用在後台運行時執行最少量化的工作。系統給後台運行的應用的執行時間和給前台運行的應用相比,通常非常有限。如果應用在後台播放音頻或者監測位置變化,則應用應該僅關注此任務,所有不必要的任務都應該被推遲。在後台執行時間過長的應用會被系統throttled back或者直接被kill掉。

下來我們操作一下看看:
AppDelegate.h:

///

UIBackgroundTaskIdentifier bgTask;

NSUInteger counter;


AppDelegate.m:

- (void)backgroundHandler {

NSLog(@"### -->backgroundinghandler");

UIApplication* app = [UIApplication sharedApplication];

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

[app endBackgroundTask:bgTask];

bgTask = UIBackgroundTaskInvalid;

}];

// Start the long-running task

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

while (1) {

NSLog(@"counter:%d", counter++);

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:numbers++];

sleep(1);

}

});

}



- (void)applicationDidEnterBackground:(UIApplication *)application {

/*

Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

If your application supports background execution, called instead of applicationWillTerminate: when the user quits.

*/

printf("\n applicationDidEnterBackground \n");

//////////////////////////////////////

BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{

[self backgroundHandler];

}];

if (backgroundAccepted)

{

NSLog(@"backgrounding accepted");

}

[self backgroundHandler];

}



info.plist:

Required background modes字段:

App provides Voice over IP services;


OK就可以看到後台程序在運行了!

可加QQ細聊64874940



  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved