簡體   English   中英

如何知道任務是否在后台執行

[英]How to know if a task is executing in background

在我的應用程序中,我正在通過一種方法下載大量圖像。

我正在使用

 downloadTask = [[UIApplication sharedApplication]
                   beginBackgroundTaskWithExpirationHandler:^{

                       [[UIApplication sharedApplication] endBackgroundTask:downloadTask]; 
                       downloadTask = UIBackgroundTaskInvalid;

                   }]; 

如果我按主頁或睡眠按鈕,則圖像會繼續下載,效果很好。

我正在UIAlertView內的UIProgressView中顯示進度,當百分比為100%時,alertView將消失,並將viewController更改為其他位置,以顯示下載的圖像。 但是我只希望這種情況在下載完成時該應用程序真正處於活動狀態時發生。

我一直在查看應用程序狀態,並且正在關閉屏幕進行下載。

[UIApplication sharedApplication].applicationState

在所有下載期間,狀態為UIApplicationStateActive

如何知道屏幕關閉還是打開時進行下載?

接受答案后進行編輯:

我剛剛發現,如果點擊主頁按鈕,該應用程序將進入UIApplicationStateBackground,如果我點擊喚醒/睡眠,它將進入UIApplicationStateInactive

按照正確答案的方法,在兩種情況下,我的應用程序都繼續下載。

屏幕處於兩種狀態(除了什至沒有打開應用程序時):

  • 暫停 :在這種情況下,您不必擔心,因為只有在應用再次激活后下載才會繼續進行; 它將進入此狀態
  • 背景 :進入暫停狀態之前,它處於這種狀態的時間有限,並且此時屏幕已經關閉。 在這里,您可能想要檢查然后是否執行您說的所有操作,因為在這種狀態下仍可以執行代碼。 在此狀態下,應用程序狀態為UIApplicationStateBackground ,因此您可以執行如下檢查:

您可能想要檢查應用程序是否在后台執行,以獲取結果。 像這樣:

if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
  // Do stuff  
}

如果它在后台,則屏幕關閉。

更新 :經過幾次測試,我發現您正在體驗的行為可能是由於在主線程上執行了下載。

您應該在(例如)全局隊列上發送下載。 這樣,應用程序將按預期進入后台狀態:

....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bti];
    }];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self doBackgroundStuff];
});
....

這樣,如果在下載過程中將應用程序置於后台,則應用程序狀態將變為UIApplicationStateBackground ,然后您可以按照我最初編寫的內容進行檢查。 如果您正在進度中進行UI更新,請記住將其發送回主線程(因為現在下載位於另一線程上)。

您可以通過在指定的應用程序委托方法applicationDidEnterBackground:applicationWillEnterForeground:設置標志來檢查您的應用程序是否在后台運行。 例:

- (void)applicationDidEnterBackground:(UIApplication *)application
    _applicationRunsInForeground = NO;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    _applicationRunsInForeground = YES;
}

如果您不希望在應用程序委托中包含此_applicationRunsInForeground標志,則可以在viewcontroller類( UIApplicationWillEnterForegroundNotificationUIApplicationDidEnterBackgroundNotification )中觀察委托的NSNotifications。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM