簡體   English   中英

當 iOS 應用程序進入后台時,冗長的任務是否暫停?

[英]When an iOS application goes to the background, are lengthy tasks paused?

是的,我知道如果我希望我的應用程序能夠響應用戶的多任務操作,例如切換到另一個應用程序,我應該處理

- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application

如果我的應用程序正在執行一個非常耗時的操作(例如下載一個大文件)並且用戶導致我的應用程序進入后台怎么辦? 當用戶回到我的應用程序時,該操作會自動暫停和恢復嗎?

當我的應用程序進入后台或在前台恢復時,幕后究竟會發生什么?

如果當用戶讓我的應用程序 go 到后台時,我的應用程序的執行只是在一個方法的中間怎么辦?

例如,我的應用正在做

for (int i = 1 to 10000K) {
    do some calculation;
}

當 i== 500K 時,用戶切換到另一個應用程序。 我的應用程序中的 for 循環會發生什么?

來自iOS 應用程序編程指南

您的應用委托的applicationDidEnterBackground:方法大約有 5 秒的時間來完成所有任務並返回。 在實踐中,此方法應盡快返回。 如果該方法在時間用完之前沒有返回,您的應用程序將被殺死並從 memory 中清除。 如果您仍然需要更多時間來執行任務,請調用beginBackgroundTaskWithExpirationHandler:方法來請求后台執行時間,然后在輔助線程中啟動任何長時間運行的任務。 無論您是否啟動任何后台任務, applicationDidEnterBackground:方法仍必須在 5 秒內退出。

如果您上面描述的長時間運行的操作在主線程上,並且在您的應用程序進入后台后需要超過 5 秒才能完成,您的應用程序將被終止。 主線程將被阻塞,您將沒有機會及時從-applicationDidEnterBackground:返回。

如果您的任務在后台線程上運行(確實應該是,如果執行時間很長),如果應用程序從-applicationDidEnterBackground:返回,則該線程似乎已暫停:(根據此答案中的討論)。 當應用程序回到前台時,它將恢復。

但是,在后一種情況下,您仍應准備好在后台隨時終止您的應用程序,方法是在前往后台的路上進行清理。

如果您正在執行一些可能會消耗時間的操作並且您不想殺死它,那么您可以通過在 UIBackground Task i 中執行來延長您的操作時間

{
    UIBackgroundTaskIdentifier  taskId = 0;
    taskId = [application beginBackgroundTaskWithExpirationHandler:^{
        taskId = UIBackgroundTaskInvalid;
    }];

// Execute long process. This process will have 10 mins even if your app goes in background mode.

}

稱為“處理程序”的塊參數是后台任務到期(10 分鍾)時會發生的情況。 這是文檔的鏈接

如上所述,在某些情況下,您的應用程序在后台運行,Apple 可以根據您的操作允許或拒絕。

https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

更重要的是,如果您確實屬於這些類別之一,那么您的應用刷新率是由蘋果算法確定的,該算法會考慮您在該設備上的應用與其他應用的使用情況。 如果您的應用程序使用更頻繁,那么它會分配更多的后台時間。 這只是一個變量,但您會發現后台時間分配因應用程序而異,不受您的控制。

暫無
暫無

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

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