2011-06-24 79 views
5

Khi ứng dụng của tôi được chuyển sang nền, tôi muốn có khả năng phát hiện khi nó sắp bị chấm dứt (vì cạn kiệt bộ nhớ hoặc vì các lý do khác). Có cách nào để làm việc này không?Làm cách nào để xác định thời điểm đơn đăng ký của tôi sắp bị chấm dứt trong nền?

Cụ thể, có cách nào để thực thi một số mã trước khi ứng dụng bị chấm dứt khi ở chế độ nền không?

+1

Tại sao bỏ phiếu để đóng? Điều này có vẻ là một câu hỏi hay với tôi. –

+7

@WTP nên đã xem nó trước khi chỉnh sửa anh hùng bởi Brad :) –

+2

@Michael Stum: thực sự, nhận xét đó cũ hơn chỉnh sửa. Một số lỗi ngữ pháp thực sự không quan trọng với tôi. Nếu nó rõ ràng những gì đang được hỏi, nó là tuyệt vời. –

Trả lời

4

Bạn có thể làm điều này trong các phương pháp -[<UIApplicationDelegate> applicationWillTerminate:] của đại biểu ứng dụng của bạn, như thế này:

- (void)applicationWillTerminate:(UIApplication *)application { 
    [database save]; // or whatever you want to do 
} 

này sẽ được thực hiện bất cứ khi nào ứng dụng sắp được chấm dứt, trừ khi nó bị treo.

+1

Điều này không đúng đối với các ứng dụng bị treo trong nền. Từ [Hướng dẫn lập trình ứng dụng iOS] (http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40007072-CH3- SW10): "Nếu ứng dụng của bạn hiện đang bị tạm ngưng, hệ thống sẽ giết ứng dụng của bạn và xóa nó khỏi bộ nhớ mà không cần thông báo". Bạn sẽ chỉ nhận được cuộc gọi lại này nếu ứng dụng của bạn đang tích cực chạy mã trong nền. –

+0

@ Brad Larson Sau đó, bạn nên thực thi mã để lưu dữ liệu trong '- [ applicationDidEnterBackground:]' hoặc tôi sẽ không thấy một cách khác. Đây là một ý tưởng hay. –

1

Điều đó tùy thuộc.

Nếu bạn muốn nhận thông báo trong khi ứng dụng của bạn bị tạm dừng trong nền, không có cách nào để biết; phương thức applicationWillTerminate: không chạy nếu bạn bị tạm ngưng. Cách tiếp cận được khuyến nghị là lưu bất kỳ trạng thái bắt buộc nào khi bạn nhận được thông báo applicationWillEnterBackground:, để nếu bạn bị giết trong nền bạn đã sẵn sàng để khởi động lại.

Nếu bạn đang ở trạng thái "thực thi ở chế độ nền" (có thể xảy ra một thời gian ngắn sau khi thoát ứng dụng hoặc nếu ứng dụng yêu cầu thời gian thực hiện nền tạm thời) thì applicationWillTerminate:sẽ được gọi giống như bạn 'd mong đợi.

+0

Theo Apple, điều này là không chính xác. Nếu ứng dụng của bạn đã nhập xử lý nền, ứng dụng sẽ nhận được applicationWillTerminate nếu người dùng hoặc hệ điều hành cần chấm dứt nó (xem Brad Larsons trả lời trích dẫn tài liệu của Apple). – RyanR

+0

Tôi đoán đó là sự thật; có một sự khác biệt giữa "nền" và "bị treo" mà tôi đã không giải quyết. Tôi sẽ sửa nó. –

4

Đặt cược tốt nhất của bạn là thực hiện bất kỳ việc dọn dẹp nào cần được thực hiện trong ứng dụng của bạn (lưu trạng thái hoặc dữ liệu người dùng, v.v.) khi ứng dụng của bạn chuyển sang nền. Nếu ứng dụng của bạn bị tạm ngưng, bạn sẽ không có cơ hội thực hiện bất kỳ mã cuối cùng nào trước khi hệ thống chấm dứt.

Từ iOS Application Programming Guide:

Nếu ứng dụng của bạn đang chạy (hoặc trong foreground hoặc background) tại thời gian chấm dứt, hệ thống gọi đại biểu ứng dụng của bạn applicationWillTerminate: Phương pháp để mà bạn có thể thực hiện mọi yêu cầu dọn dẹp. Bạn có thể sử dụng phương pháp này để lưu dữ liệu người dùng hoặc trạng thái đơn đăng ký thông tin mà bạn sẽ sử dụng để khôi phục ứng dụng của bạn về trạng thái hiện tại khi khởi chạy tiếp theo. Triển khai phương pháp của bạn có khoảng 5 giây để thực hiện bất kỳ tác vụ và trả lại. Nếu nó không trở lại đúng lúc, ứng dụng là bị giết và bị xóa khỏi bộ nhớ. Phương thức applicationWillTerminate: là không được gọi nếu đơn đăng ký của bạn là hiện bị tạm ngưng.

Ngay cả khi bạn phát triển ứng dụng của mình bằng iOS SDK 4 trở lên, bạn phải để chuẩn bị cho đơn đăng ký của bạn bị hủy mà không cần thông báo. Người dùng có thể giết các ứng dụng sử dụng rõ ràng giao diện người dùng đa nhiệm. Ngoài ra, nếu bộ nhớ trở thành bị hạn chế, hệ thống có thể xóa ứng dụng khỏi bộ nhớ để thực hiện thêm phòng.Nếu ứng dụng của bạn hiện đang bị tạm ngưng , hệ thống sẽ hủy ứng dụng của bạn và xóa ứng dụng đó khỏi bộ nhớ mà không cần thông báo. Tuy nhiên, nếu ứng dụng của bạn hiện đang chạy ở trạng thái nền (nói cách khác, không bị tạm ngưng), hệ thống sẽ gọi applicationWillTerminate: phương thức ủy quyền ứng dụng của bạn. Ứng dụng của bạn không thể yêu cầu thêm thời gian thực hiện nền từ phương thức này.

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