-2

Tìm hiểu về Service trong Android

1. Động cơ

  • Một ngày chủ nhật đẹp trời muốn tìm hiểu về Service trong Android là cái chi chi sau khi đã viết về Activity và Broadcast Receiver.
  • Trong dự án đang được tham gia có sử dụng Service và xảy ra vấn đề về tiêu tốn điện. Hy vọng sau khi tìm hiểu có thể cải thiện ứng dụng trong dự án hoặc đưa ra các ý kiến cần thiết.

2. Service và những điều cơ bản

Service là 1 thành phần chạy ở background để thực hiện một công việc "dài hơi" mà không cần tương tác với người dùng, nó sẽ vẫn chạy kể cả ứng dụng đã bị tắt (destroyed). Một service có thể cần 2 trạng thái:

  • Được chạy (Started): Một service được chạy khi một thành phần của ứng dụng như activity chạy nó bằng cách gọi method startService(). Một khi đã được chạy, service đó có thể chạy vô hạn dưới background kể cả sau khi thành phần gọi nó đã bị kết thúc (destroyed).
  • Bị rằng buộc (Bound): Một service bị rằng buộc khi một thành phần của ứng dụng rằng buộc với nó bằng cách gọi method bindService(). Một ứng dụng bị rằng buộc cung cấp một interface (giao diện) máy khách máy chủ (client-server) cho phép các thành phần được tương tác với service, gửi yêu cầu (request), lấy kết quả và thậm chí giữa các process bằng giao tiếp liên process (IPC). Một service có các method callback trong vòng đời (life cycle) để bạn có thể thực thi (implement) nhằm quan sát những thay đổi trong trạng thái của service, từ đó thực hiện những công việc thích hợp ở thời điểm nhất định. Tại hình dưới đây miêu tả vòng đời của service. Bên tay trái là với service được tạo bởi startService(), bên tay phải là service được tạo bởi bindService() services.jpg Để tạo một service, bạn cần tạo một Java Class kế thừa (extends) Service base class hoặc một trong những subclass đang tồn tại của nó. Service base class định nghĩa rất nhiều các callback method và những method quan trọng nhất được đề cập dưới đây. Bạn không cần thực thi (implement) toàn bộ các callback method, tuy nhiên hãy cố gắng hiểu được hết ý nghĩa và đảm bảo ứng dụng hoạt động đúng những gì người dùng muốn.
  • onStartCommand(): Hệ thống gọi method này khi một thành phần khác ví dụ như một activity yêu cầu service này chạy bằng cách gọi startService(). Nếu bạn muốn thực thi method này, cần phải nhớ trách nhiệm thuộc về bạn khi phải kết thúc service sau khi công việc của nó đã kết thúc bằng cách gọi method stopSelf() hoặc stopService().
  • onBind(): Hệ thống gọi method này khi một thành phần khác một rằng buộc với service này bằng cách gọi bindService(). Nếu bạn thực thi method này, bạn nhất định phải cung cấp một giao diện mà những máy khách (client) sẽ sử dụng để giao tiếp với service này bằng cách trả về một IBinder object. Bạn phải luôn luôn thực thi method này tuy nhiên nếu bạn không muốn cho phép việc rằng buộc hãy trả về null.
  • onUnbind(): Hệ thống gọi method này khi tất cả máy khách (client) đã ngắt kết nối bằng một giao diện nhất định được công bố bởi service này.
  • onRebind(): Hệ thống gọi method này khi những máy khách (client) kết nối với service, sau khi nó đã được thông báo trước rằng tất cả các máy khách đã ngắt kết nối bằng onUnbind(Intent).
  • onCreate(): Hệ thống gọi method này khi service được tạo ra lần đầu bằng onStartCommand() hoặc onBind(). Việc gọi này là tất yếu để thực hiện cài đặt một lần.
  • onDestroy(): Hệ thống gọi method này khi service không còn sử dụng nữa và đã bị kết thúc (destroyed). Service của bạn cần thực thi method này để xóa sạch toàn bộ các tài nguyên (resource) như thread, listener đã được đăng ký hay receiver..

3. Cách sử dụng service

Khung service sau thể hiện các method trong vòng đời của nó:

package com.tutorialspoint;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
		/** chỉ dẫn xem cần hoạt động thế nào khi service này kết thúc*/
		int mStartMode;
		/** giao diện cho các máy khách (client) có thể rằng buộc (bind) */
		IBinder mBinder;
		/** chỉ dẫn xem liệu onRebind có cần sử dụng không should be used */
		boolean mAllowRebind;
		/** Được gọi khi service này được tạo ra. */
		@Override
		public void onCreate() {
		}
		/** Service này đang chạy do có một cuộc gọi tới startService() */
		@Override
		public int onStartCommand(Intent intent, int flags, int startId) {
			return mStartMode;
		}
		/** Máy khách đang rằng buộc với service này bằng bindService() */
		@Override
		public IBinder onBind(Intent intent) {
			return mBinder;
		}
		/** Được gọi khi tất cả các máy khách đã ngắt việc rằng buộc bằng unbindService() */
		@Override
		public boolean onUnbind(Intent intent) {
			return mAllowRebind;
		}
		/** Được gọi khi 1 máy khách rằng buộc với service này bằng bindService()*/
		@Override
		public void onRebind(Intent intent) {
		}
		/** Được gọi khi service này không còn được sử dụng và đang bị kết thúc*/
		@Override
		public void onDestroy() {
		}
}

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí