2011-07-11 46 views
67

Vâng, tôi biết nếu tôi muốn ứng dụng của tôi để được đáp ứng với hành động đa nhiệm của người sử dụng, chẳng hạn như chuyển đổi sang ứng dụng khác, tôi phải đối phó vớiKhi ứng dụng iOS chạy ẩn, các tác vụ kéo dài có bị tạm dừng không?

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

gì nếu ứng dụng của tôi đang làm một thời gian khá dài tiêu thụ hoạt động (như tải xuống một tệp lớn) và người dùng khiến ứng dụng của tôi nhập vào nền? Liệu hoạt động đó có tự động bị tạm ngưng và tiếp tục khi người dùng quay lại ứng dụng của tôi không?

Chính xác điều gì sẽ xảy ra sau cảnh khi ứng dụng của tôi vào nền hoặc tiếp tục ở nền trước?

Điều gì sẽ xảy ra nếu người dùng để ứng dụng của tôi chuyển sang nền, việc thực thi ứng dụng của tôi chỉ ở giữa phương thức?

Đối với ví dụ, ứng dụng của tôi đang làm

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

Khi tôi == 500K, người dùng chuyển sang ứng dụng khác. Điều gì sẽ xảy ra với vòng lặp for trong ứng dụng của tôi?

+2

Tôi nghĩ câu hỏi rất hay của nó, nhưng bạn có thực sự dành thời gian để kiểm tra và tìm ra điều gì xảy ra khi nó chuyển sang nền không? Ý tôi là, đặt một NSLog bên trong vòng lặp một nơi nào đó và xem điều gì sẽ xảy ra ... – MiguelB

+2

Thứ nhất, theo khuyến cáo của micpringle dưới đây là khuyến khích. Thứ hai, nếu tôi nhớ chính xác, không có bảy API rất cụ thể được phép chạy trong nền không? Nhìn vào chúng và xem chúng có phù hợp với hóa đơn không. Nếu không, có thể bạn cần phải thiết kế lại cách ứng dụng của bạn làm việc. –

Trả lời

67

Từ iOS App Programming Guide:

phương pháp đại biểu ứng dụng của bạn applicationDidEnterBackground: có khoảng 5 giây để hoàn thành bất cứ nhiệm vụ và trở về. Trong thực tế, phương thức này sẽ trở lại nhanh nhất có thể. Nếu phương thức không trở lại trước khi hết giờ, ứng dụng của bạn sẽ bị xóa và bị xóa khỏi bộ nhớ . Nếu bạn vẫn cần thêm thời gian để thực hiện các tác vụ, hãy gọi phương thức beginBackgroundTaskWithExpirationHandler: để yêu cầu thời gian thực hiện nền và sau đó bắt đầu bất kỳ tác vụ nào trong một chủ đề phụ . Bất kể bạn có bắt đầu bất kỳ tác vụ nền nào hay không, phương pháp applicationDidEnterBackground: vẫn phải thoát trong vòng 5 giây.

Nếu hoạt động lâu dài bạn mô tả ở trên nằm trên luồng chính và phải mất hơn 5 giây để hoàn tất sau khi ứng dụng của bạn chuyển sang nền, ứng dụng của bạn sẽ bị giết. Chủ đề chính sẽ bị chặn và bạn sẽ không có cơ hội trở lại từ -applicationDidEnterBackground: trong thời gian.

Nếu tác vụ của bạn đang chạy trên một chuỗi nền (và nó thực sự cần, nếu mất nhiều thời gian để thực thi), chủ đề đó dường như bị tạm dừng nếu ứng dụng trả về từ -applicationDidEnterBackground: (theo các cuộc thảo luận trong this answer). Nó sẽ được tiếp tục khi ứng dụng được đưa trở lại nền trước.

Tuy nhiên, trong trường hợp thứ hai, bạn vẫn nên chuẩn bị cho đơn đăng ký của mình bị chấm dứt bất kỳ lúc nào khi đang ở chế độ nền bằng cách làm sạch mọi thứ trên đường của bạn.

+0

tinh thể rõ ràng, cảm ơn –

10

Nếu bạn đang làm một số hoạt động mà có thể tiêu tốn thời gian và bạn không muốn giết nó thì bạn có thể kéo dài thời gian cho các hoạt động của bạn bằng cách thực hiện trong công tác UIBackground 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. 

} 

Đối số khối gọi là " xử lý "là điều sẽ xảy ra khi tác vụ nền hết hạn (10 phút). Đây là liên kết tới số documentation

0

Như đã đề cập ở trên, có một số trường hợp ứng dụng của bạn chạy ở chế độ nền và táo có thể cho phép hoặc từ chối tùy thuộc vào việc bạn đang làm.

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

Quan trọng hơn nếu bạn phù hợp với một trong các loại tỷ lệ làm mới ứng dụng của bạn được xác định bởi một thuật toán táo mà sẽ đưa vào xem xét việc sử dụng ứng dụng của bạn trên thiết bị đó vs các ứng dụng khác. Nếu ứng dụng của bạn được sử dụng thường xuyên hơn thì nó sẽ được phân bổ nhiều thời gian hơn. Đây chỉ là một biến nhưng bạn nhận được ý tưởng rằng phân bổ thời gian nền thay đổi ứng dụng cho ứng dụng chứ không phải dưới sự kiểm soát của bạn.

Các vấn đề liên quan