So sánh một dịch vụ lớp cơ sở, đang xử lý, cục bộ ✱ với AsyncTask:
✱ (Câu trả lời này không đề cập đến các dịch vụ xuất khẩu, hoặc bất kỳ dịch vụ nào chạy trong một quy trình khác với dịch vụ của khách hàng, vì các trường hợp sử dụng dự kiến khác biệt đáng kể với các dịch vụ của AsyncTask. Ngoài ra, về lợi ích của sự ngắn gọn, bản chất của một số chuyên ngành nhất định Servicelớp con (ví dụ IntentService, JobService) sẽ bị bỏ qua ở đây.)
Quá trình suốt đời
A Serviceđại diện cho HĐH, "mong muốn của ứng dụng là thực hiện thao tác chạy lâu hơn trong khi không tương tác với người dùng" [ ref ].
Trong khi bạn có một Service đang chạy, Android hiểu rằng bạn không muốn quá trình của mình bị giết. Điều này cũng đúng bất cứ khi nào bạn có một Activitymàn hình và điều này đặc biệt đúng khi bạn đang chạy một dịch vụ nền trước . (Khi tất cả các thành phần ứng dụng của bạn biến mất, Android nghĩ, "Ồ, bây giờ là thời điểm tốt để giết ứng dụng này, vì vậy tôi có thể giải phóng tài nguyên".)
Ngoài ra, tùy thuộc vào giá trị trả lại cuối cùng từ Service.onCreate() , Android có thể cố gắng "hồi sinh" các ứng dụng / dịch vụ đã bị hủy do áp lực tài nguyên [ ref ].
AsyncTasksđừng làm điều đó Không quan trọng bạn đang chạy bao nhiêu luồng nền hay chúng hoạt động mạnh đến mức nào: Android sẽ không giữ ứng dụng của bạn tồn tại chỉ vì ứng dụng của bạn đang sử dụng CPU. Nó phải có một số cách biết rằng ứng dụng của bạn vẫn còn việc phải làm; đó là lý do tại sao Servicesđược đăng ký với HĐH và AsyncTaskskhông.
Đa luồng
AsyncTasks tất cả là về việc tạo ra một luồng nền để thực hiện công việc, và sau đó trình bày kết quả của công việc đó cho luồng UI theo cách an toàn của luồng.
Mỗi lần AsyncTaskthực hiện mới thường dẫn đến nhiều đồng thời hơn (nhiều luồng hơn), tuân theo các giới hạn của nhóm AsyncTasks'sluồng [ ref ].
Servicemặt khác, các phương thức luôn được gọi trên luồng UI [ ref ]. Này áp dụng cho onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), vv Vì vậy, trong một nghĩa nào đó, Serviceskhông "chạy" ở chế độ nền. Khi họ bắt đầu (onCreate() ), họ chỉ cần "ngồi" ở đó - cho đến khi dọn dẹp, thực hiện mộtonStartCommand() , v.v.
Nói cách khác, việc thêm bổ sung Serviceskhông dẫn đến đồng thời nhiều hơn. Các phương thức dịch vụ không phải là nơi tốt để thực hiện một lượng lớn công việc, vì chúng chạy trên luồng UI .
Tất nhiên, bạn có thể mở rộng Service, thêm các phương thức của riêng bạn và gọi chúng từ bất kỳ luồng nào bạn muốn. Nhưng nếu bạn làm điều đó, trách nhiệm về an toàn luồng sẽ thuộc về bạn - không phải là khung.
Nếu bạn muốn thêm một chủ đề nền (hoặc một số loại công nhân khác) cho bạn Service, bạn có thể tự do làm điều đó. Bạn có thể bắt đầu một sợi nền / AsyncTasktrong Service.onCreate(), ví dụ. Nhưng không phải tất cả các trường hợp sử dụng đều yêu cầu điều này. Ví dụ:
- Bạn có thể muốn tiếp tục
Servicechạy để bạn có thể tiếp tục nhận được cập nhật vị trí trong "nền" (nghĩa là không nhất thiết phải có bất kỳ Activitiesmàn hình nào ).
- Hoặc, bạn có thể muốn giữ cho ứng dụng của mình tồn tại chỉ để bạn có thể giữ một "ẩn" được
BroadcastReceiverđăng ký trên cơ sở lâu dài (sau API 26, bạn không thể luôn thực hiện việc này qua bảng kê khai, vì vậy bạn phải đăng ký khi chạy [ ref ]).
Cả hai trường hợp sử dụng này đều yêu cầu rất nhiều hoạt động của CPU; họ chỉ yêu cầu ứng dụng không bị giết .
Là công nhân
Serviceskhông định hướng nhiệm vụ. Họ không được thiết lập để "thực hiện một nhiệm vụ" và "cung cấp một kết quả", giống như AsyncTaskslà. Serviceskhông giải quyết bất kỳ vấn đề an toàn luồng nào (mặc dù thực tế là tất cả các phương thức thực thi trên một luồng). AsyncTasksmặt khác, xử lý sự phức tạp đó cho bạn.
Lưu ý rằng AsyncTaskđược dự kiến sẽ deprecation . Nhưng điều đó không có nghĩa là bạn nên thay thế AsyncTasksbằng Services! (Nếu bạn đã học được bất cứ điều gì từ câu trả lời này, điều đó sẽ rõ ràng.)
TL; DR
Serviceschủ yếu là ở đó để "tồn tại". Chúng giống như một màn hình ngoài Activity, cung cấp một lý do để ứng dụng tồn tại, trong khi các thành phần khác đảm nhận việc thực hiện "công việc". AsyncTaskslàm "công việc", nhưng bản thân họ sẽ không giữ cho một quá trình tồn tại.