Trong ứng dụng Android của tôi, tôi có chế độ xem danh sách đơn giản với bộ điều hợp. Có một truy vấn nặng để lấp đầy chế độ xem danh sách với dữ liệu. Vì vậy, tôi đặt nó vào một IntentService chạy trong một chủ đề khác.Bắt đầu IntentService từ Hoạt động và làm mới Hoạt động khi IntentService được hoàn thành
IntentService thường chạy riêng rẽ, chỉ để truy vấn một số dữ liệu và chèn nó vào cơ sở dữ liệu SQLite.
Nhưng bây giờ tôi muốn có khả năng sau đây:
- Các hoạt động khởi động IntentService với startService().
- IntentService thực hiện công việc nặng nhọc của nó.
- Khi IntentService kết thúc, nó sẽ thông báo cho hoạt động về kết quả để hoạt động có thể được làm mới để hiển thị dữ liệu mới.
Điều này có khả thi không? Tôi đọc rất nhiều câu hỏi ở đây về Stack Overflow về chủ đề này. Nhưng trong mọi câu hỏi, có một giải pháp khác. Vì vậy, tôi muốn hỏi tất cả các bạn: Giải pháp nào là tốt nhất cho mục đích của tôi?
- Ràng buộc IntentService vào hoạt động dường như không phải là giải pháp tốt nhất vì có thể có xung đột với thay đổi cấu hình hoạt động, v.v.
- This blog post đề xuất sử dụng AIDL với các kiện hàng - nghe có vẻ rất phức tạp đối với tôi. Có một cách dễ dàng hơn, phải không?
- Người ta có thể thiết lập bộ thu phát sóng trong hoạt động và kích hoạt phát sóng này trong IntentService khi nó kết thúc.
- Một số người nói rằng bạn nên use createPendingResult() to pass a PendingIntent cho IntentService. Nếu IntentService tìm thấy PendingIntent trong phần bổ sung của nó, nó sử dụng nó để kích hoạt onActivityResult() trong Activity. Đây có phải là cách để lựa chọn không?
Cảm ơn bạn rất nhiều vì giải pháp này và mô tả chi tiết! Tôi có phải đăng ký ResultReceiver hoặc Mục đích tùy chỉnh trong tệp kê khai Android không? Và tôi có thể đặt những thứ như một ArrayList hoặc một con trỏ vào gói kết quả? Tôi có cần bưu kiện ở đó không? – caw
Trình kết quả không cần phải được đăng ký trong tệp kê khai nhưng tôi có mục đích tùy chỉnh đã đăng ký cho mục đích của mình. Bạn có thể gọi IntentService theo bất kỳ cách nào bạn muốn miễn là có một Intent để truyền ResultReceiver. Đối với resultBundle bạn có thể đặt bất cứ thứ gì trong đó một Bundle có thể xử lý. – Squonk
Điều thú vị là hai chủ đề tương tự đều có giải pháp được chấp nhận bằng cách sử dụng ResultReceiver, nhưng cách chính thức có vẻ là LocalBroadcastManager. Tôi nghĩ rằng lý do mà LocalBroadcastManager là thích hợp hơn vì ResultReceiver có thể bị phá hủy nếu hoạt động bị phá hủy và sau đó khởi động lại? –