1. 后臺駐留
iOS 中所謂的「后臺駐留」并不是指「執行中的程序」,而是「最近使用過的程序」
Apple 的知識庫文章解釋:
按兩下主畫面按鈕后,顯示的是「最近用過的應用程序」,所以別把它想成Mac OS X 中的Command + Tab 鍵所顯示的切換程序列。
你可以試試看將iPhone 關機再開機,然后按兩下 Home 鍵,應該會發現先前那些程式還是出現在那里,因為它其實是你最近使用過的程序使用記錄,或像是瀏覽器中的瀏覽記錄。
如果你一個一個去清除 "后臺駐留" 的程序,就像是一筆一筆刪除瀏覽記錄中的項目一樣,是沒有太大意義的(除非你不想讓其他人看到你曾經用過什么程式,或者想殺時間、太無聊了),也不會對電力或記憶體有什么幫助。
iOS 的多任務處理其實是很聰明的,系統會自動中止在背景執行的程序,在有需要時,也會將被中止的程式 suspended(掛起)(注:"中止的程式"不是指關閉程序,而是指由前臺轉向后臺的程序,程序在后臺并不真正運行,不要和關閉程序混淆了) 從內存中移除。因此,iOS 裝置的使用者根本就不需要擔心怎么管理這些執行中或不在執行中的程序。
所以點擊兩下Home之后顯示的是記錄,并且這些記錄是有的是掛起狀態,也有應用因為內存吃緊而被關閉,當你將應用劃出記錄的時候,其實做的是兩個操作。
清除記錄
完全關閉應用(關閉進程)
2.掛起
一般說來,所有程式進入背景后都還有1-5秒的執行緩沖時間(視內存壓力而決定),有些程序可以要求延長到10 分鐘(這些當然是由開發人員在設計與提交程式時決定和聲明),因此,在你按下 Home 鍵后,本來的程式就會退到后臺,如果它有額外的后臺執行作業,超過10分鐘還是會被 iOS 中止,但是,也有例外情況,某些特殊類型的程式是被容許在背景中持續執行的,像是會持續在背景播放音樂的程序、GPS 程序、VOIP 程序、Newsstand 以及周邊配件附屬的程序,不過只要這些程序不再執行動作,就會變成中止的程式,像是音樂撥完了、雜志下載完了。
既然是多任務你應該會在應用進入后臺時做一些處理,比如暫停一些界面的定時刷新或網絡請求。同時,或者你會在程序進入前臺時執行一些恢復操作。
-
<p> 在你的應用的application delegate里有2個消息用于處理這些消息:</p>
- (void)applicationDidEnterBackground:(UIApplication*)application
{
//進入后臺時要進行的處理
}
- (void)applicationWillEnterForeground:(UIApplication*)application
{
//進入前臺時要進行的處理
}
3.延長程序掛起的時間(最多十分鐘)
調用UIApplication的
eginBackgroundTaskWithExpirationHandler
方法,可以讓 app 最多有10分鐘的時間在后臺長久運行
-
<p> 首先:聲明一個實例 <p>
@interface AppDelegate ()
{
//用來保存后臺運行任務的標示符
UIBackgroundTaskIdentifier backgroundTask;
}
</code> </pre>
-
<p>然后實現代碼 </p>
- (void)applicationDidEnterBackground:(UIApplication *)application {
//通知系統, 我們需要后臺繼續執行一些邏輯
backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
//超過系統規定的后臺運行時間, 則暫停后臺邏輯
[application endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}];
//判斷如果申請失敗了, 返回
if (backgroundTask == UIBackgroundTaskInvalid) {
NSLog(@"beginground error");
return;
}
//已經成功向系統爭取了一些后臺運行時間, 實現一些邏輯, 如網絡處理
//some code
}
-
<p> 處理完之后掛起線程 </p>
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
4.無限后臺運行
首先聲明你需要的后臺任務
在Info.plist中添加UIBackgroundModes鍵值,它包含一個或多個string的值,包括:
- audio:在后臺提供聲音播放功能,包括音頻流和播放視頻時的聲音
- location:在后臺可以保持用戶的位置信息
- voip:在后臺使用VOIP功能
<p>前面的每個value讓系統知道你的應用程序應該在適當的時候被喚醒。例如,一個應用程序,開始播放音樂,然后移動到后臺仍然需要執行時間,以填補音頻輸出緩沖區。添加audio鍵用來告訴系統框架,需要繼續播放音頻,并且可以在合適的時間間隔下回調應用程序;如果應用程序不包括此項,任何音頻播放在移到后臺后將停止運行。</p>
-
<p> 下面以后臺播放音樂為例:</p>
<p>在Supporting Files目錄下的【02 應用進入后臺繼續播放音樂-Info.plist】 增加一項【Required background modes】 值為【App plays audio or streams audio/video using AirPlay】<p>
iamge
// 后臺播放,
AVAudioSession * session = [AVAudioSession sharedInstance];
// 類型是:播放和錄音
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
// 而且要激活 音頻會話
[session setActive:YES error:nil];