您好,登錄后才能下訂單哦!
當一個iOS 應用被送到后臺,它的主線程會被暫停。你用NSThread的detachNewThreadSelector:toTarget:withObject:類方法創(chuàng)建的線程也被掛起了。如果你想在后臺完成一個長期任務,就必須調(diào)用UIApplication
的beginBackgroundTaskWithExpirationHandler:實例方法,來向iOS 借點時間。UIApplication的
backgroundTimeRemaining屬性包含了程序完成他的任務可以使用的秒數(shù)。如果在這個期限內(nèi),長期任務沒有被完成,iOS 將終止程序。每個對beginBackgroundTaskWithExpirationHandler:方法的調(diào)用,必須要相應的調(diào)用endBackgroundTask:方法(UIApplication的另一個實例方法)。也就是說,如果你向iOS 要更多時間來完成一個任務,你必須告訴iOS 你什么時候能完成那個任務,那時,你的程序?qū)⒑推渌斜粫和5木€程被放入后臺。
當你的程序在前臺時,UIApplication的backgroundTimeRemaining屬性等于DBL_MAX常量,這是double類型可表示的最大值(和這個值相當?shù)膇nteger 通常等于-1)。在iOS 被要求在程序被完全掛起之前給于更多的執(zhí)行時間,這個屬性指明了在完成任務前程序擁有多少秒。
在程序中你可以多次調(diào)用beginBackgroundTaskWithExpirationHandler:方法。要記住的重點是,當iOS 為你的程序返回一個token 或者任務標識(task identifier)時,你都必須調(diào)用endBackgroundTask:方法,在運行的任
務結(jié)束時,用來標志任務結(jié)束。如果你不這么做的話,iOS 會終止你的程序。
在后臺時,程序不應該執(zhí)行完全的功能,也不應該處理大量數(shù)據(jù)。事實上,他們只應該完成一個長期任務。
比如,一個程序正在調(diào)用一個web service API,并且還沒有從服務器上的那個API接收到響應。在此期
間,如果程序被送入后臺,它可以請求更多的時間,直到它從服務器收到響應。一旦響應被接收,程序必須保存其狀態(tài),并調(diào)用UIApplication的endBackgroundTask:實例方法將任務標記為完成。
下面我們看看代碼實現(xiàn)的步驟:
1、定義一個任務標識
- @property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backtaskIdentifier;
2、當ios app 進入后臺時,會自動調(diào)用appdelegate的
- (void)applicationDidEnterBackground:(UIApplication *)application 方法,在這里我們編寫要執(zhí)行的任務
- - (void)applicationDidEnterBackground:(UIApplication *)application
- {
- //檢測多任務的可用性
- if ([self isMultitaskingSupported] == NO) {
- return;
- }
- //定義要完成的任務 ,開始執(zhí)行,
- ......
- //返回一個任務標識
- self.backtaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void){
- // do something 。。。
- //結(jié)束該任務
- [[UIApplication sharedApplication] endBackgroundTask:self.backtaskIdentifier];
//將任務標識符標記為 UIBackgroundTasksInvalid,標志任務結(jié)束- self.backtaskIdentifier = UIBackgroundTaskInvalid;
- }];
- }
如上代碼所示,我們在使用多任務的前提,一定是我們的系統(tǒng)支持多任務,可見檢測任務的可用性是一項必不可少的步驟:
- - (BOOL) isMultitaskingSupported{
- BOOL result;
- if ([[UIDevice currentDevice]respondsToSelector:@selector(isMultitaskingSupported)]) {
- result = [[UIDevice currentDevice] isMultitaskingSupported];
- }
- return result;
- }
我們調(diào)用 beginBackgroundTaskWithExpirationHandler: (UIApplication的一個實例方法) 方法,為app 返回了一個token 或任務標識,那么我們必須調(diào)用 endBackgroundTask: (UIApplication的另一個實例方法)方法來結(jié)束該任務.
在后臺任務的 完成處理者 (即beginBackgroundTaskWithExpirationHandler: 的塊函數(shù),)中,我們結(jié)束了任務,并進行必要的清理工作。
3、當我們的app回到前臺的時候會調(diào)用- (void)applicationWillEnterForeground:(UIApplication *)application 方法,此時如果后臺任務還在進行中我們就要結(jié)束他。
我想原理應該已經(jīng)講清楚了。本人剛學不久,不當之處敬請指出,以做修改,求共進。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。