2011-12-29 17 views
9

Tôi đang bối rối về Activity.onDestroy(). Tôi cần giải phóng một số tài nguyên khi Activity của tôi bị phá hủy, nhưng có vẻ như onDestroy() được gọi khi tôi nhấn phím "Back", nhưng không phải khi Activity của tôi bị Dalvik giết. Tôi đã thử nghiệm nó chỉ bằng cách thêm log:Android: Activity.onDestroy() không được gọi khi Dalvik giết hoạt động này

Log.v("my_tag", "onDestroy() called");

và giống nhau ở onCreate() phương pháp quá:

Log.v("my_tag", "onCreate() called");

Sau đó, tôi bắt đầu Hoạt động của tôi, và tôi thấy trong nhật ký: onCreate() called. Tôi nhấn "Back" chìa khóa và sau đó bắt đầu Hoạt động một lần nữa, sau đó tôi thấy:

onDestroy() called 
onCreate() called 

Sau đó, tôi bấm "Home" chìa khóa và đi đến Hoạt động của tôi một lần nữa, các bản ghi không thay đổi. Được rồi.

Sau đó, tôi nhấn phím "Home" một lần nữa và bắt đầu một số ứng dụng "nặng" thực sự. Trong nhật ký không có gì về onDestroy(), nhưng khi tôi bắt đầu lại Hoạt động của mình, tôi thấy trong nhật ký: onCreate() called! Vì vậy, onDestroy() đã không được gọi, nhưng hoạt động của tôi đã bị giết. Chuyện gì vậy?

+1

+1 - cho nghiên cứu của bạn .. –

Trả lời

8

Từ các tài liệu onDestroy():

[..] Có những tình huống mà hệ thống chỉ đơn giản là sẽ giết quá trình lưu trữ của hoạt động mà không gọi phương pháp này (hoặc bất kỳ người khác) trong nó, vì vậy nó không nên được sử dụng để làm những việc được dự định ở lại khoảng sau khi quá trình này biến mất.

Trong Android, bạn sẽ không nhận được cuộc gọi được đảm bảo onDestroy().
Nếu bạn muốn phát hành một số tài nguyên, bạn nên làm điều đó trong onPause() thay thế.

+0

Hmm, cảm ơn. Trong tài liệu cũng nói: "Toàn bộ vòng đời của một hoạt động diễn ra giữa lần gọi đầu tiên đến onCreate (Bundle) đến một cuộc gọi cuối cùng tới onDestroy()", vì vậy, tôi nghĩ nó nên được gọi là anyway. Vậy thì, tôi nên giải phóng ở đâu để chắc chắn nó sẽ được gọi? Trên thực tế, 'Hoạt động' này liên kết' Dịch vụ' và tôi muốn hủy liên kết nó trước khi Hoạt động bị hủy. –

+0

Ồ, tôi xin lỗi, tôi thấy rằng bạn đã nói: tôi nên làm điều đó trong 'onPause()'. Cảm ơn một lần nữa. –

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