2010-06-15 34 views
14

Tôi có một Dịch vụ đang chạy trong cùng một quy trình với Ứng dụng của mình.Dịch vụ Android đã bị giết

Đôi khi HĐH Android quyết định hủy dịch vụ của tôi (có thể do bộ nhớ thấp).

Câu hỏi của tôi là: Đơn đăng ký của tôi có bị giết cùng với Dịch vụ không? hoặc làm thế nào nó hoạt động chính xác?

Cảm ơn!

Trả lời

35

Đầu tiên hãy chắc chắn để đọc: http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

Chìa khóa để này là trên Android một quá trình chỉ là một container cho mã - - hoặc cụ thể là một hoặc nhiều thành phần (hoạt động, dịch vụ, người nhận, nhà cung cấp). Theo mặc định, tất cả các thành phần trong một .apk đều có được quy trình riêng, riêng của chúng, tất cả chúng đều chạy cùng nhau. Điều này gần như luôn luôn là những gì bạn muốn.

Khi người dùng tương tác trực tiếp với một thành phần của quá trình đó (đó là một hoạt động), Android sẽ cố gắng hết sức để giữ cho quá trình đó chạy, và bạn sẽ không thấy nó bị chết trừ trường hợp bất thường.

Khi người dùng không còn tương tác trực tiếp với quy trình, khi đó người dùng sẽ trở nên có thể tiêu thụ tương ứng với các quy trình khác như được mô tả trong tài liệu được tham chiếu. Đó là, các quy trình rỗng (không có thành phần thú vị) sẽ bị giết trước khi các tiến trình giữ các hoạt động mà người dùng đã sử dụng, sẽ bị giết trước các tiến trình với các dịch vụ đang chạy. Vì vậy, có một dịch vụ đang chạy sẽ có xu hướng để giữ cho quá trình của bạn xung quanh tại các chi phí của các quá trình khác.

Đồng thời, chúng ta cần phải xử lý tốt với ngày càng nhiều ứng dụng để các dịch vụ chạy, thường xuyên vô thời hạn và thường bị rò rỉ bộ nhớ. Vì vậy, có một dịch vụ chạy trong một thời gian dài, Android sẽ cố gắng ít hơn và ít khó khăn hơn để giữ cho quá trình của nó diễn ra. Có hiệu quả điều này có nghĩa là di chuyển nó xuống xô nền cho đến khi kẻ giết người ra khỏi bộ nhớ lấy nó ra. Sau đó, nếu dịch vụ vẫn muốn chạy, thì một quy trình mới sẽ được tạo để khởi động lại.

Điều này là do các dịch vụ thông thường đang chạy trong một thời gian dài. sẽ bị giết sau một thời gian.Điều này không cần phải dừng dịch vụ; một dịch vụ muốn tiếp tục chạy sẽ làm như vậy, nó sẽ chỉ cần được khởi tạo trong một quy trình mới. Tất nhiên miễn là người dùng đang tương tác với một hoạt động trong quá trình của bạn, quá trình này sẽ không bị giết, vì điều này sẽ kéo nó vào danh mục nền trước bất kể những gì đang xảy ra với bất kỳ dịch vụ nào trong đó.

+0

cảm ơn câu trả lời hữu ích của bạn! để cụ thể hơn một chút: Tôi phân lớp từ Ứng dụng và trong đó tôi giữ một tham chiếu đến đối tượng Dịch vụ của mình. Khi dịch vụ của tôi bị giết, làm cách nào tôi có thể lấy lại tài liệu tham khảo về dịch vụ mới? hoặc đối tượng ứng dụng của tôi cũng chết cùng và khi nó được tái instantiated tất cả mọi thứ là giống như khi tôi lần đầu tiên bắt đầu ứng dụng? – Erdal

+2

Khi giết một cái gì đó cho bộ nhớ, toàn bộ quá trình (bao gồm cả các đối tượng ứng dụng) bị giết và không có mã thực hiện trong nó vào thời điểm này. Nếu dịch vụ vừa bị hủy vì không còn cần chạy nữa, lệnh onDestroy() của nó sẽ được gọi và khi dịch vụ này sau đó cần một cá thể mới được tạo và onCreate() được gọi. Cá nhân tôi thường khuyên bạn không nên sử dụng Ứng dụng; nó không thực sự cung cấp cho bạn bất cứ điều gì trên chỉ sử dụng các lớp singleton tĩnh, và tôi nghĩ rằng thiết lập kỳ vọng cho mọi người (w.r.t. có một mô hình ứng dụng truyền thống hơn) mà không thực sự giữ. – hackbod

+0

Tôi hiểu ý của bạn là gì. Vấn đề duy nhất tôi có, buộc tôi phải sử dụng lớp Ứng dụng là tôi không muốn liên kết với Dịch vụ từ tất cả các Hoạt động khác nhau của mình. Tôi chỉ gọi ràng buộc trong phương thức onCreate của ứng dụng và sau đó tất cả các hoạt động khác truy cập Dịch vụ thông qua ứng dụng Singleton của tôi. Bạn có gợi ý điều gì tốt hơn không? – Erdal

3

Quy trình bị giết bởi kẻ giết người bộ nhớ thấp, không phải Ứng dụng. Vì vậy, trừ khi bạn làm thêm công việc để Dịch vụ của bạn chạy trong một quy trình khác, khi đó Hoạt động của bạn sẽ bị giết cùng với Dịch vụ của bạn.

Kẻ giết người bộ nhớ thấp không cố gắng tiêu diệt bất kỳ đối tượng nào trong quá trình của bạn, mặc dù người quản lý hoạt động có thể gọi onDestroy trên đối tượng Hoạt động không còn cần thiết nữa. Nhưng điều đó xảy ra như là một phần của vòng đời hoạt động bình thường, không phải do điều kiện bộ nhớ thấp.

(Bằng cách này, tôi chưa rõ liệu bạn có nghĩa là "ứng dụng" nói chung, hoặc đối tượng của bạn mà kéo dài Application, hoặc cho dù bạn có nghĩa là hoạt động của bạn mà hiển thị giao diện người dùng.)

+0

theo đơn đăng ký Tôi có nghĩa là đối tượng của tôi kéo dài từ Đơn đăng ký – Erdal

1

Đơn là cái gì đó có giao diện người dùng và nếu bạn đã bao gồm một dịch vụ cùng với nó, thì chắc chắn nó sẽ bị xóa vì Ứng dụng bị chấm dứt khi hàng đợi ứng dụng được lưu trữ trở thành đầy đủ

để tạo Dịch vụ tách biệt với ứng dụng hoặc nói cách khác tạo một dự án khác cho nó :)

btw, tôi không phải là một người có kinh nghiệm Android de veloper nhưng thats tôi nghĩ rằng những gì tôi đã học bằng cách xem video vòng đời phát triển Android của Google

+1

Chắc chắn không tạo dự án khác. Cũng không có dịch vụ chạy trong một quá trình khác (thông qua android: process) ngoại trừ trong những trường hợp rất đặc biệt. – hackbod

+0

vâng, tôi đang cố giữ dịch vụ của mình trong cùng một quy trình. Nó có lẽ nhanh hơn và dễ dàng hơn cho tôi để chỉ gọi các phương pháp tĩnh hơn để thực hiện aidl – Erdal

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