Tìm hiểu về Service trong Android

01:50:54 - 21/07/2018 - admin

Bài này sẽ giới thiệu cho các bạn biết cách sử dụng Service trong Android. Đây là một thành phần quan trọng trong việc phát triển một ứng dụng Android. Khác với Activity, Service trong Android chạy ở chế độ nền, chúng không có giao diện và có vòng đời rất khác với Activity.

Một Service có các phương thức lặp lại vòng đời mà bạn có thể thực hiện để theo dõi các thay đổi trong trạng thái của dịch vụ và bạn có thể thực hiện công việc ở giai đoạn thích hợp. Sơ đồ bên trái cho thấy vòng đời khi dịch vụ được tạo bằng startService () và sơ đồ bên phải cho thấy vòng đời khi dịch vụ được tạo bằng bindService ().

Để tạo một Service, bạn tạo một lớp Java mở rộng lớp cơ sở Service hoặc một trong các lớp con hiện có của nó. Bạn không cần phải thực hiện tất cả các phương thức callbacks. Tuy nhiên, điều quan trọng là bạn hiểu từng cái và triển khai những ứng dụng đảm bảo ứng dụng của bạn hoạt động theo cách người dùng mong đợi.

Hoạt động Mô tả
onStartCommand () Hệ thống bắt đầu gọi phương thức này khi một thành phần khác, chẳng hạn như một hoạt động, yêu cầu khởi động Service bằng cách gọi hàm startService (). Nếu bạn thực hiện phương pháp này, bạn cần dừng dịch vụ khi công việc của nó đang đượ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 một thành phần khác muốn liên kết với dịch vụ bằng cách gọi bindService (). Nếu bạn thực hiện phương pháp này, bạn phải cung cấp một giao diện mà khách hàng sử dụng để giao tiếp với Service bằng cách trả về một đối tượng IBinder. Bạn phải luôn luôn thực hiện phương thức này, nhưng nếu bạn không muốn cho phép thì bạn trả về null .
onUnbind () Hệ thống gọi phương thức này khi tất cả các máy khách đã ngắt kết nối khỏi một giao diện cụ thể được Service xuất bản.
onRebind () Hệ thống gọi phương thức này khi các máy khách mới đã kết nối với Service , sau khi nó đã được thông báo trước đó rằng tất cả đã bị ngắt kết nối trong onUnbind (Intent) của nó.
onCreate () Hệ thống gọi phương thức này khi Service được tạo đầu tiên bằng cách sử dụng onStartCommand () hoặc onBind () . Cuộc gọi này là bắt buộc để thực hiện thiết lập một lần.
onDestroy () Hệ thống gọi phương thức này khi Service không còn được sử dụng và đang bị hủy. Service của bạn nên thực hiện điều này để dọn sạch mọi tài nguyên chẳng hạn như chủ đề, người nghe đã đăng ký, người nhận, v.v.
  1. Khởi động Service

2.1. Thực hiện và khai báo

Một Service cần được khai báo trong tệp AndroidManifest.xml và lớp triển khai phải mở rộng Service lớp hoặc một trong các lớp con của nó.

Đoạn mã sau cho thấy một ví dụ cho một khai báo Service và thực hiện nó.

<service

   android:name=”MyService”

   android:icon=”@drawable/icon”

   android:label=”@string/service_name”

   >

</service>

public class MyService extends Service {

 @Override

 public int onStartCommand(Intent intent, int flags, int startId) {

     //TODO do something useful

     return Service.START_NOT_STICKY;

 }

 @Override

 public IBinder onBind(Intent intent) {

   //TODO for communication return IBinder implementation

   return null;

 }

}

2.2. Bắt đầu Service

Một thành phần Android (dịch vụ, người nhận, hoạt động) có thể kích hoạt việc thực hiện Service thông qua startService(intent) phương thức.

// use this to start and trigger a service

Intent i= new Intent(context, MyService.class);

// potentially add data to the intent

i.putExtra(“KEY1”, “Value to be used by the service”);

context.startService(i);

Ngoài ra, bạn cũng có thể bắt đầu một Service thông qua bindService(). Điều này cho phép bạn giao tiếp trực tiếp với Service.

2.3. Quá trình bắt đầu và thực thi Service

Khi Service được khởi động, onStartCommand(intent) phương thức trong Service được gọi. Nó truyền vào Intent đối tượng từ startService(intent).

Nếu startService(intent) được gọi trong khi dịch vụ đang chạy thì onStartCommand() cũng được gọi. Do đó dịch vụ của bạn cần phải được chuẩn bị onStartCommand() có thể được gọi nhiều lần.

Nếu bạn gọi phương thức này hai lần trong mã của bạn thì sao? Bạn có phải lo lắng về việc đồng bộ hóa onStartCommand()cuộc gọi phương thức không? Câu trả lời là không, phương thức này được gọi bởi hệ thống Android trong luồng giao diện người dùng chính, do đó nó không thể được gọi đồng thời từ hai luồng khác nhau.

Một Service chỉ được bắt đầu một lần, bất kể bạn gọi startService() phương thức này bao lâu một lần .

2.4. Khởi động lại Service

Trong onStartCommand() Service trả về một int định nghĩa hành vi khởi động lại của trong trường hợp Service bị chấm dứt bởi nền tảng Android. Bạn có thể sử dụng các hằng số, các tùy chọn phổ biến nhất được mô tả bởi bảng sau.

Tùy chọn Nội dung
Service. START_STICKY Service được khởi động lại nếu nó bị chấm dứt. Dữ liệu ý định được truyền cho onStartCommandphương thức là null. Được sử dụng cho các Service quản lý trạng thái và không phụ thuộc vào Intent dữ liệu.
Service.START_NOT_STICKY Service không được khởi động lại. Được sử dụng cho các Service được kích hoạt định kỳ. Service chỉ được khởi động lại nếu thời gian chạy có startService() xử lý kể từ khi chấm dứt Service.
Service.START_REDELIVER_INTENT Tương tự như Service.START_STICKY nhưng bản gốc Intent được phân phối lại cho onStartCommandphương thức.

Bạn có thể kiểm tra xem Service đã được khởi động lại thông qua Intent.getFlags() hay chưa. START_FLAG_REDELIVERY (trong trường hợp Service được bắt đầu với Service.START_REDELIVER_INTENT) hoặc START_FLAG_RETRY (trong trường hợp Service được bắt đầu với Service .START_STICKY) được chuyển.

2.5. Dừng Service

Bạn dừng Service thông qua phương thức stopService(). Bất kể bạn gọi startService(intent) này thường xuyên như thế nào, nếu gọi đến stopService() sẽ dừng Service.

Tài liệu về Android khác:

Ý kiến bạn đọc

Bình luận qua Disqus Facebook