[英]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 可以根據您的操作允許或拒絕。
更重要的是,如果您確實屬於這些類別之一,那么您的應用刷新率是由蘋果算法確定的,該算法會考慮您在該設備上的應用與其他應用的使用情況。 如果您的應用程序使用更頻繁,那么它會分配更多的后台時間。 這只是一個變量,但您會發現后台時間分配因應用程序而異,不受您的控制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.