Lớp IntentService
cung cấp một cấu trúc đơn giản để chạy thao tác trên một luồng ở chế độ nền. Nhờ đó, tiện ích này có thể xử lý các hoạt động diễn ra trong thời gian dài mà không ảnh hưởng đến khả năng phản hồi của giao diện người dùng. Ngoài ra, IntentService
không bị ảnh hưởng bởi hầu hết các sự kiện trong vòng đời giao diện người dùng, vì vậy, IntentService
này sẽ tiếp tục chạy trong các trường hợp sẽ tắt AsyncTask
IntentService
có một số giới hạn:
-
Công cụ này không thể tương tác trực tiếp với giao diện người dùng. Để đưa kết quả vào giao diện người dùng, bạn phải gửi các kết quả đó đến
Activity
. -
Yêu cầu công việc chạy tuần tự. Nếu một thao tác đang chạy trong
IntentService
và bạn gửi một yêu cầu khác cho thao tác đó, thì yêu cầu sẽ chờ cho đến khi thao tác đầu tiên hoàn tất. -
Bạn không thể làm gián đoạn thao tác đang chạy trên
IntentService
.
Tuy nhiên, trong hầu hết trường hợp, IntentService
là cách được ưu tiên để thực hiện các thao tác đơn giản ở chế độ nền.
Hướng dẫn này chỉ cho bạn cách thực hiện những việc sau:
- Tạo lớp con
IntentService
của riêng bạn. - Tạo phương thức gọi lại cần thiết
onHandleIntent()
. - Xác định
IntentService
trong tệp kê khai.
Xử lý ý định đến
Để tạo một thành phần IntentService
cho ứng dụng, hãy xác định một lớp mở rộng IntentService
. Trong lớp này, hãy xác định một phương thức ghi đè onHandleIntent()
. Ví dụ:
Kotlin
class RSSPullService : IntentService(RSSPullService::class.simpleName) override fun onHandleIntent(workIntent: Intent) { // Gets data from the incoming Intent val dataString = workIntent.dataString ... // Do work here, based on the contents of dataString ... } }
Java
public class RSSPullService extends IntentService { @Override protected void onHandleIntent(Intent workIntent) { // Gets data from the incoming Intent String dataString = workIntent.getDataString(); ... // Do work here, based on the contents of dataString ... } }
Xin lưu ý rằng các lệnh gọi lại khác của thành phần Service
thông thường, chẳng hạn như onStartCommand()
sẽ được IntentService
tự động gọi. Trong IntentService
, bạn nên tránh việc ghi đè các lệnh gọi lại này.
Để tìm hiểu thêm về cách tạo IntentService
, hãy xem bài viết Mở rộng lớp IntentService.
Xác định dịch vụ ý định trong tệp kê khai
IntentService
cũng cần một mục nhập trong tệp kê khai ứng dụng của bạn.
Cung cấp mục nhập này dưới dạng phần tử <service>
là phần tử con của phần tử
<application>
:
<application android:icon="@drawable/icon" android:label="@string/app_name"> ... <!-- Because android:exported is set to "false", the service is only available to this app. --> <service android:name=".RSSPullService" android:exported="false"/> ... </application>
Thuộc tính android:name
chỉ định tên lớp của IntentService
.
Xin lưu ý rằng phần tử <service>
không chứa bộ lọc ý định. Activity
gửi yêu cầu công việc đến dịch vụ sử dụng một Intent
rõ ràng, vì vậy, không cần bộ lọc nào. Điều này cũng có nghĩa là chỉ các thành phần trong cùng một ứng dụng hoặc các ứng dụng khác có cùng mã nhận dạng người dùng mới có thể truy cập vào dịch vụ.
Giờ đây khi đã có lớp IntentService
cơ bản, bạn có thể gửi yêu cầu công việc đến lớp đó bằng các đối tượng Intent
. Quy trình tạo và gửi các đối tượng này đến IntentService
được mô tả trong phần Gửi yêu cầu công việc đến dịch vụ nền.