iOS在升級到4.0以後就支援了多任務了。下文將詳細介紹一下這個特性。
1、檢查裝置是否支援多任務
Apple出於效能的考慮,並不是所有的iOS裝置升級到iOS4以後都支援多任務,比如iPhone
3G。如果你的應用在沒有多任務特性時會出問題,為了保持應用的健壯性,你應該對此進行判斷並處理。你可以通過調用UIDevice對象的multitaskingSupported屬性來擷取當前裝置是否支援多任務。
if(![UIDevice currentDevice].multitaskingSupported){
//不支援多任務時應做的處理
}
2、基本多任務特性
通常,當使用者按一下Home鍵,當前應用就會被進入後台,應用處在後台運行狀 態一小段時間後,就會進入掛起(suspend)狀態,此時應用不會再執行任何代碼。如果系統在運行其他應用時記憶體資源不足,這個掛起的應用甚至有可能被 系統退出,釋放記憶體以供活動的應用使用。只有當使用者再次運行此應用,應用才會從掛起狀態喚醒,代碼得以繼續執行。這就是iOS4帶來的基本的多任務特性,這個特性是一般應用預設支援的,就是說你的應用不需要任何修改就能支援基本多任務特性。
既然是多任務你應該會在應用進入後台時做一些處理,比如暫停一些介面的定時重新整理或網路請求。同時,或者你會在程式進入前台時執行一些恢複操作。在你的應用的application delegate裡有2個訊息用於處理這些訊息:
- (void)applicationDidEnterBackground:(UIApplication *)application {
//進入後台時要進行的處理
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
//進入前台時要進行的處理
}
當然你也許不會都在application delegate處理所有的事情。如果你要在其他對象中處理,那麼你就需要註冊系統通知了,這兩個通知分別是UIApplicationDidEnterBackgroundNotification和UIApplicationWillEnterForegroundNotification。
也許你需要更多的多任務特性,比如後台播放音樂或者是後台進行GPS跟蹤。這會是下面介紹的內容。
3、後台播放音樂
通常,一般應用在進入後台時,任何聲音就將會停止。這也許不是我們所想要的。要想讓自己的應用支援後台播放,首先要修改應用的Info.plist 檔案,你需要在Info.plist檔案中添加UIBackgroundModes欄位,該欄位的值是應用支援的所有後台模式,是一個數群組類型。目前此數
組可以包含“audio”、“location”和“voip”這三個字串常量,如果要支援後台音樂播放,你就需要包含“audio”,其餘兩個會將在 後面講到。
同時,你也應該設定一下應用程式的Audio Sesstion。這個是必需的,如果不設定Audio Sesstion,應用就可能進入後台時Audio Sesstion失活而停止播放。一般需要這麼設定就可以了:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
4、後台GPS跟蹤
和後台播放音樂類似,若要支援後台GPS跟蹤,你就需要在Info.plist檔案中UIBackgroundModes欄位對應的數組中增加“location”字串。
5、後台voip支援
由於voip應用需要一個長串連到伺服器,為了讓這類應用能正常工作,iOS中假如後台voip支援特性。為支援這一特性,需要在Info.plist檔案中UIBackgroundModes欄位對應的數組中增加“voip”字串。
此外你仍然需要配置一下你的網路連接,以便支援後台串連。iOS提供的網路連接庫有幾種,下面一一說明:
如果你使用的是NSStream,如NSInputStream或NSOutputStream,需要調用setProperty:forKey:將Key為NSStreamNetworkServiceType的value設定為NSStreamNetworkServiceTypeVoIP
如果你使用NSURLRequest,需要調用setNetworkServiceType:將網路類型設定為NSURLNetworkServiceTypeVoIP
如果你使用CFStream,如CFReadStreamRef或CFWriteStreamRef,需要調用 CFReadStreamSetProperty或CFWriteStreamSetProperty將 kCFStreamNetworkServiceType屬性設定為kCFStreamNetworkServiceTypeVoIP。
1.運行邏輯代碼:
-(void)execBackrgoundMethod
{
/*
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, this method is called instead of applicationWillTerminate: when the user quits.
*/
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{ //在這裡寫你要在後運行行的代碼
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
2.後台彈出UILocalNotification:
- (void)scheduleAlarmForDate:(NSDate*)theDate
{
//theDate延遲多長時間彈出
UIApplication* app = [UIApplication sharedApplication];
NSArray* oldNotifications = [app scheduledLocalNotifications];
// Clear out the old notification before scheduling a new one.
if ([oldNotifications count] > 0)
[app cancelAllLocalNotifications];
// Create a new notification.
UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];
if (alarm)
{
alarm.fireDate = theDate;
alarm.timeZone = [NSTimeZone defaultTimeZone];
alarm.repeatInterval = 0;
alarm.soundName = @"alarmsound.caf";
alarm.alertBody = @"Time to wake up!";
[app scheduleLocalNotification:alarm];
}
}
For more details, please click the link below:
https://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html
http://mobile.tutsplus.com/tutorials/iphone/ios-multitasking-local-notifications/