Tạo một dịch vụ dưới nền

Lớp IntentService cung cấp một cấu trúc đơn giản để chạy một thao tác trên một luồng trong nền. Điều này cho phép thư viện xử lý các thao tác 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 của giao diện người dùng. Vì vậy, lệnh 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ố hạn chế:

  • Lớp 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 kết quả đó đến Activity.
  • Các yêu cầu công việc sẽ 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 kết thúc.
  • Không thể gián đoạn một hoạt động đang chạy trên IntentService.

Tuy nhiên, trong hầu hết các trường hợp, IntentService là cách ưu tiên để thực hiện các thao tác đơn giản ở chế độ nền.

Hướng dẫn này sẽ hướng dẫn bạn cách thực hiện những việc sau:

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 và trong lớp đó, 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
        ...
    }
}

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ẽ tự động được IntentService gọi. Trong IntentService, bạn nên tránh 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 phần Mở rộng lớp IntentService.

Xác định dịch vụ ý định trong tệp kê khai

IntentService cũng cần có một mục nhập trong tệp kê khai ứng dụng. Cung cấp mục này dưới dạng một 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.

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 Intent rõ ràng, vì vậy, không cần bộ lọc. Đ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.