2011-08-29 22 views
46

Sơ đồ vòng đời của một Hoạt động trên Android không đảm bảo rằng onDestroy() sẽ được gọi, nhưng quá trình đó có thể bị hủy và Hoạt động bị xóa đột ngột. Sơ đồ vòng đời của một Dịch vụ trên Android đảm bảo rằng onDestroy() sẽ được gọi. Vì vậy, tôi có hai câu hỏi liên quan đến sự khác biệt này.Dịch vụ Android có được bảo đảm để gọi onDestroy() không?

Thứ nhất, nếu Dịch vụ là một phần của quá trình tương tự như Hoạt động, Dịch vụ onDestroy() có được gọi là, mặc dù Activity onDestroy() không được gọi? Tôi nghĩ rằng không, như "giết chết một quá trình" cho thấy rằng hệ điều hành là dừng lại chủ đề của nó và phát hành các nguồn lực của nó.

Và nếu đúng như vậy, quy trình chỉ dịch vụ có thể bị hệ điều hành đột ngột giết không?

Trả lời

29

Tôi không chắc chắn nơi bạn thấy rằng Dịch vụ được đảm bảo có số gọi onDestroy(). Theo tôi biết, đây không phải là trường hợp. Nếu bạn đọc this trang tài liệu, nó mô tả các điều kiện trong đó một dịch vụ có thể bị giết. Vì vậy, nếu bạn đang yêu cầu nếu một quá trình lưu trữ cả một hoạt động và dịch vụ đang bị giết, sẽ onDestroy() được gọi trên dịch vụ (nhưng không phải trên hoạt động) thì câu trả lời là không; một dịch vụ của onDestroy() sẽ không nhất thiết phải được gọi. Về việc liệu một quy trình chỉ dịch vụ có thể bị hệ điều hành đột ngột giết không, có, nó có thể. Điều này đặc biệt đúng khi bạn có nhiều việc phải làm và lệnh gọi onStartCommand của bạn chỉ xếp hàng công việc để thực hiện không đồng bộ. Sau đó, dịch vụ sẽ dành phần lớn thời gian của mình không phải trong các phương pháp được bảo vệ onCreate, onStartCommand hoặc onDestroy.

+0

Liên kết đó là những gì tôi muốn xem. Cảm ơn! Tôi chỉ bối rối khi nhìn vào sơ đồ vòng đời, bởi vì người ta cho thấy trường hợp của quá trình bị giết và người kia thì không. Tôi nghĩ rằng sau này được ngụ ý, tuy nhiên. Chỉ cần không biết nơi để xác minh suy nghĩ của tôi. – user574771

+1

cách nhận thông báo khi bạn cần dọn dẹp dịch vụ trước khi tắt máy? ví dụ, tôi muốn cache một số trạng thái và xả nó vào bộ nhớ trước khi bị tắt; nếu tôi không bao giờ nói với tôi là đóng cửa, tôi sẽ mất nhà nước của tôi - không tốt! – Michael

+1

@Michael Cân nhắc chuyển nó sang lưu trữ định kỳ/bất cứ khi nào dữ liệu của bạn thay đổi. Đó là một câu hỏi hợp lý. Trong thực tế, nếu câu trả lời đơn giản của tôi không thỏa mãn bạn, nó sẽ đáng để đăng câu hỏi của riêng bạn về điều này để có được một số câu trả lời chuyên sâu tốt. – kabuko

10

Có hai điều cần xem xét:

  1. Android might decide to shut down a process at some point, when memory is low and required by other processes that are more immediately serving the user. Application components running in the process that's killed are consequently destroyed. A process is started again for those components when there's again work for them to do.Trong trường hợp này onDestroy() không được gọi như hệ điều hành Android sẽ đòi lại nguồn lực nào (đây là nhiệm vụ cơ bản của hệ điều hành nói chung - trong trường hợp bạn không biết rằng).
  2. A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy(). Vì vậy, khi hệ điều hành Android thấy rằng Dịch vụ đã hoàn thành công việc của mình và không còn cần thiết nữa - nó sẽ bị hệ điều hành Android hủy hoại. Hệ điều hành Android cho phép nhà phát triển có cơ hội giải phóng tài nguyên của Dịch vụ không gây rò rỉ bộ nhớ. Trong trường hợp này, onDestroy() được gọi là vì đây là nơi mà nhà phát triển có thể giải phóng tài nguyên. Tất nhiên trong quy trình của ứng dụng này không bị ảnh hưởng (vì có thể có các Dịch vụ/Hoạt động khác đang chạy trong đó).
+0

'Khi cả hai tình huống này không tồn tại'! =' Protected'! = 'Always' –

+0

Vì vậy? Nhận xét này là gì? Bạn đã trích dẫn một phần tài liệu chính thức, vì vậy? –

+0

Tôi trích dẫn cùng một phần tài liệu chính thức mà bạn đã làm. Nó nói rằng 'Khi cả hai tình huống này không được giữ, phương thức onDestroy() của dịch vụ được gọi là'. Nó vẫn có nghĩa là ngay cả khi cả hai tình huống giữ dịch vụ sẽ không bị giết mà không có 'onDestroy' được gọi. Và trong thực tế điều đó xảy ra là đúng. –

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