Tìm hiểu về Service trong Android

Service trong Android là một thành phần giúp thực hiện các tác vụ chạy nền mà không cần tương tác với người dùng và nó hoạt động ngay cả khi ứng dụng bị tắt hoàn toàn.

Nếu bạn sử dụng ứng dụng nghe nhạc Zing Mp3 thì có thấy rằng khi bạn mở một bài hát lên, sau đó mặc dù bạn đã thoát ứng dụng nghe nhạc rồi nhưng bài nhạc vẫn còn phát, trừ khi bạn tạm dừng thì bài hát mới ngừng phát.

1. Trạng thái của một Service trong Android

Mỗi Service trong Android về cơ bản có hai trạng thái là Started và Bound.

  • Started: Một Service được bắt đầu bằng cách gọi hàm startService(), sau khi bắt đầu Service thì nó có thể chạy ngầm vô thời hạn ngay cả khi thành phần bắt đầu nó bị hủy.
  • Bound: Một Service bị ràng buộc khi một thành phần ứng dụng liên kết với nó bằng cách gọi bindService(). Một Service bị ràng buộc 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 dịch vụ, gửi các yêu cầu, nhận kết quả…

Service trong Android đơn thuần là một thành phần có thể chạy ngầm ngay cả khi người dùng không đang tương tác với ứng dụng của bạn.

2. Vòng đời Service trong Android

Khi khởi tạo một Service bạn cần cài đặt một số hàm quan trọng trong vòng đời Service sau đây:

onStartCommand()

Hệ thống sẽ gọi phương pháp này khi một thành phần khác chẳng hạn như một Activity yêu cầu dịch vụ phải được bắt đầu bằng cách gọi startService(), sau đó dịch vụ có thể chạy vô thời hạn trong nền.

Nếu như đã hoàn thành xong tác vụ thì bạn nên ngừng dịch vụ bằng cách gọi stopSelf() hoặc stopService().

onBind()

Hệ thống sẽ gọi phương pháp này khi một thành phần khác muốn gắn kết với Service bằng cách gọi bindService().

Nếu như triển khai phương pháp này bạn phải cung cấp một giao diện mà các máy khách sử dụng để giao tiếp với dịch vụ bằng cách trả về đối tượng IBinder, nếu không bạn có thể trả về rỗng (null).

onCreate()

Hệ thống sẽ gọi phương pháp này khi Service khởi chạy lần đầu trước khi gọi hàm onStartCommand() hoặc onBind().

onDestroy()

Hệ thống sẽ gọi phương pháp này khi Service không còn được sử dụng, hàm này giúp dọn dẹp mọi tài nguyên.

Hệ thống Android sẽ buộc dừng một Service chỉ khi bộ nhớ thấp.

3. Khởi tạo Service trong Android

Một Service cần phải được khai báo trong tập tin AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.teamvietdev.androidbasicservice">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
		
      <service android:name=".MyService" />

   </application>

</manifest>

Để tạo một Service trong Android bạn phải tạo một lớp con kế thừa từ lớp Service và sau đó triển khai một số phương thức cần thiết.

public class MyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
         return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
         return null;
    }

}

Trong đó:

  • Service.START_STICKY: Service được khởi động lại nếu nó bị tắt đi.
  • Service.START_NOT_STICKY: Service không được khởi động lại.
  • Service.START_REDELIVER_INTENT: Hệ thống tắt bỏ dịch vụ sau khi onStartCommand() trả về, hãy tạo lại dịch vụ và gọi onStartCommand()

Kích hoạt một Service thông qua gọi phương thức startService() chẳng hạn ở một Activity như sau:

Intent intent = new Intent(context, MyService.class);
intent.putExtra("KEYNAME", "Value...");
context.startService(intent);

Lời kết: Cám ơn bạn đã theo dõi bài viết tìm hiểu về Service trong Android, ngoài ra các bạn có thể xem thêm các nội dung khác trong chuyên mục lập trình Android được chia sẻ với Team Việt Dev.

(Tác giả: Team Việt Dev)

Bình luận