2013-07-25 34 views
7

Tôi có một dịch vụ được yêu cầu chạy trong một thời gian dài trong nền. Dịch vụ tiền cảnh không phù hợp do thông báo. Nó cần phải chạy lặng lẽ trong nền làm nó bỏ phiếu. Nó thực hiện điều này và hành xử như nó cần. Đây không phải là vấn đề của tôi, đây chỉ là một số nền tảng.Làm thế nào để xử lý một cách duyên dáng một dịch vụ Android bị hệ điều hành giết?

Khi dịch vụ bị người dùng giết và onDestroy() được gọi, dữ liệu được lưu vào db - Không có vấn đề ở đó. Ngoài ra khi điện thoại bị tắt, tôi có một bộ thu phát sóng để nghe/tắt màn hình. Một lần nữa không có vấn đề tiết kiệm ở đó.

Sự cố là khi hệ điều hành giết dịch vụ do bộ nhớ thấp. Dịch vụ này bị giết và tôi không tin onDestroy() được gọi. Nếu có, dữ liệu của tôi không được lưu trữ. Vì vậy, nếu dịch vụ bị giết và đã chạy trong một thời gian, tất cả thông tin mà nó thu thập sẽ bị mất.

Vì vậy, sau tất cả, câu hỏi của tôi là: Làm cách nào để dọn dẹp tài nguyên của mình một cách duyên dáng và lưu dữ liệu của tôi? Có cách nào tôi có thể chạy một số mã để lưu dữ liệu của tôi trước khi hệ thống giết dịch vụ của tôi không? Tôi đã xem xét việc thực hiện dịch vụ của mình lưu vào cơ sở dữ liệu trong khoảng thời gian vài phút để giảm lượng dữ liệu bị mất. Tôi không chắc làm thế nào tốt này là hiệu suất khôn ngoan. Các truy vấn sẽ chỉ có thể chèn tối đa 30 hàng trong khoảng thời gian 5 phút. Có khả năng ít hơn.

Tôi là một người mới phát triển tương đối mới và đã cố hết sức để tìm kiếm vấn đề này trước khi đến đây để đặt câu hỏi. Xin lỗi nếu tôi đã bỏ qua điều gì đó.

Cảm ơn!

+0

onDestroy nên được gọi và bạn có thể duy trì dữ liệu của mình tại đó. Tải nó khi dịch vụ được khởi động lại. –

+0

onDestroy() không được gọi khi hệ thống kết thúc dịch vụ do tài nguyên thấp. @BLaZuRE - Tài liệu bạn liên kết là dành cho Hoạt động. Sửa tôi nếu tôi sai nhưng dịch vụ không có phương thức onPause()? –

Trả lời

3

Nếu dịch vụ của bạn bị giết bởi os, không mã của bạn có thể được thực thi trong sự kiện này, vì vậy bạn cần lưu dữ liệu của mình sau khi thay đổi.

Nếu thực tế, dịch vụ nền sẽ khởi động lại nếu dịch vụ trả lại.START_STICKY_COMPATIBILITY trong onStartCommand(), đó là lựa chọn mặc định và bạn không cần phải lo lắng về điều đó. Chỉ cần khởi tạo nhanh dịch vụ của bạn và lưu kết quả của bạn càng sớm càng tốt.

+0

Vì vậy, bạn có đề xuất lưu dữ liệu của tôi trong một khoảng thời gian không? Nói 2 phút hay gì đó? –

+0

Nếu bạn không thể theo dõi thay đổi dữ liệu, chỉ cần lưu dữ liệu định kỳ. – faylon

+0

Tôi có thể lưu thay đổi dữ liệu. Tôi chỉ không chắc chắn nếu điều này được coi là thực hành xấu để truy cập cơ sở dữ liệu này thường xuyên. Nhưng cảm ơn bạn, tôi sẽ chấp nhận câu trả lời của bạn. –

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