Tìm hiểu về Service trong Android

1488

1.KHÁI NIỆM

Một Service là một thành phần mà chạy trong Background để thực hiện các hoạt động mà không cần tương tác với người dùng và nó làm việc ngay cả khi nếu ứng dụng bị hủy. Về cơ bản, một Service nhận hai trạng thái:

Started Một Service được bắt đầu (started) khi một Component, chẳng hạn như activity, bắt đầu bằng việc gọi startService(). Khi đã được bắt đầu, một Service có thể chạy ngầm định trong Background, ngay cả khi thành phần mà bắt đầu nó đã bị hủy
Bound Một Service được gắn kết (bound) khi một Component kết nối tới nó bởi việc gọi bindService(). Một bound service cung cấp một giao diện Client-Server cho phép các thành phần để tương tác với Service đó, gửi yêu cầu, nhận kết quả, và có thể thực hiện một số tiên trình khác với Interprocess Communication (IPC)

Một Service có các phương thức callback mà bạn có thể triển khai để giám sát các thay đổi trong trạng thái của Service và bạn có thể thực hiện công việc trên các giai đoạn cụ thể. Sơ đồ bên trái minh họa vòng đời của Service khi Service được tạo với phương thức startService() và sơ đồ bên phải minh họa vòng đời Service khi Service được tạo với bindService():

tim-hieu-ve-service-trong-android

Để tạo một Service, bạn tạo một lớp Java mà kế thừa lớp cơ sở Service hoặc một trong các lớp con đang tồn tại của nó. Lớp cơ sở Service định nghĩa các phương thức callback đa dạng và các phương thức quan trọng nhất được liệt kê dưới đây. Bạn không cần triển khai toàn bộ chúng. Điều quan trọng là bạn hiểu từng phương thức và cách triển khai chúng để đảm bảo ứng dụng của bạn vận hành như người dùng mong đợi.

Callback Miêu tả
onStartCommand() Hệ thống gọi phương thức này khi thành phần khác, chẳng hạn một activity, yêu cầu rằng Service bắt đầu, bằng việc gọi startService(). Nếu bạn triển khai phương thức này, thì bạn cũng cần dừng nó khi công việc đã được thực hiện, bằng cách gọi phương thức stopSelf()hoặc stopService()
onBind() Hệ thống gọi phương thức này khi thành phần khác muốn liên kết với Service bởi gọi bindService(). Nếu bạn triển khai phương thức này, bạn phải cung cấp một giao diện mà client sử dụng để giao tiếp với Service đó, bằng việc trả về một đối tượng IBinder. Bạn phải luôn luôn triển khai phương thức này, nếu bạn không muốn cho phép liên kết, thì bạn nên trả về null.
onUnbind() Hệ thống gọi phương thức này khi tất cả client đã bị ngắt kết nối với một giao diện nào đó đã được công bố bởi Service này
onRebind() Hệ thống gọi phương thức này khi client mới đã kết nối tới Service này, sau khi nó đã được thông báo trước đó rằng tất cả đã bị ngắt kết nối trong phương thức onUnbind(Intent) của nó .
onCreate() Hệ thống gọi phương thức này khi Service là được tạo đầu tiên bởi sử dụng onStartCommand() hoặc onBind(). Lời gọi này là cần thiết để thực hiện cài đặt one-time
onDestroy() Hệ thống gọi phương thức này khi Service không còn được sử dụng nữa và đang bị hủy. Service của bạn nên triển khai phương thức này để xóa bất cứ Resource nào như thread, registered listener, receiver, …

Ngoài 2 loại dịch vụ trên, có một dịch vụ khác gọi là IntentService. Intent Service được sử dụng để thực hiện các nhiệm vụ một lần duy nhất, nghĩa là khi nhiệm vụ hoàn thành dịch vụ tự hủy.

2. So sánh các loại dịch vụ:

Unbound Service
(Không giàng buộc)
Bound Service
(Giàng buộc)
Intent
Service
Unbounded Service được sử dụng để thực hiện nhiệm vụ lâu dài và lặp đi lặp lại. Bounded Service được sử dụng để thực hiện nhiệm vụ ở nền (background) và giàng buộc với thành phần giao diện. Intent Service được sử dụng để thực hiện các nhiệm vụ một lần duy nhất, nghĩa là khi nhiệm vụ hoàn thành dịch vụ tự hủy.
Unbound Service được khởi động bởi gọi startService(). Bounded Service được khởi động bởi gọi bindService(). Intent Service được khởi động bởi gọi startService().
Unbound Service bị dừng lại hoặc bị hủy bởi gọi một cách tường minh phương thức stopService(). Bounded Service bị gỡ giàng buộc hoặc bị hủy bởi gọi unbindService(). IntentService gọi một cách không tường minh phương thức stopself() để hủy
Unbound Service độc lập với thành phần đã khởi động nó. Bound Service phụ thuộc vào thành phần giao diện đã khởi động nó. Intent Service độc lập với thành phần đã khởi động nó.

 

 

 

 

 

 

**Unbound Service (hoặc còn gọi là Started Service): Trong trường hợp này, một thành phần ứng dụng khởi động dịch vụ bằng cách gọi startService(), và dịch vụ sẽ tiếp tục chạy trong nền (background), ngay cả khi các thành phần khởi tạo nó bị phá hủy. Ví dụ, khi được bắt đầu, một dịch vụ sẽ tiếp tục chơi nhạc trong nền vô thời hạn.

Phương thức onStartCommand() trả về kiểu integer, và là một trong các giá trị sau:
  • START_STICKY : tự động tái tạo lại dịch vụ sau khi nó kết thúc.
  • START_NOT_STICKY : nói với các hệ điều hành để không bận tâm tái tạo các dịch vụ một lần nữa.
  • TART_REDELIVER_INTENT: giá trị thứ ba mà nói với các hệ điều hành để tạo lại các dịch vụ và truyền một Intenttương tự cho onStartCommand().