[Android căn bản] Bài 10: Service trong Android-Phần 1 Giới thiệu

[Android căn bản] Bài 10: Service trong Android-Phần 1 Giới thiệu

Chào các bạn chúng ta lại gặp nhau trong series Android truyền kì hôm nay tôi sẽ giới thiệu với các bạn về service trong Android. Vì phần này khá dài nên mình sẽ chia làm bốn phần cho các  bạn dễ đọc chứng tống một lúc hết thì các bạn dễ bị bội thực lắm 😀 phải dùng chiến thuật chia để trị đúng không nào :D.

Phần này tôi chỉ giới thiệu sơ qua cho các  bạn về service thôi những phần sau tôi sẽ giới thiệu chi tiết từng loại service với các bạn.

Service là gì?

Nghe cái tên là các bạn hiểu rồi đúng hơm sơ vịt có nghĩa là dịch vụ nó chính là một thành phần chạy ngầm trên hệ điều hành để thực hiện các hoạt động dài hạn mà không cần đến sự tương tác của người dùng và nó có thể hoạt động ngay cả khi ứng gọi nó bị hủy bỏ.

Ví dụ như ứng dụng đồng hồ báo thức trong máy bạn chẳng hạn. Đồng hồ báo thức có thể báo thức cho bạn đúng giờ bạn cài đặt mặc dù bạn đã tắt ứng dụng của nó đi rồi nhưng dịch vụ của nó thì vẫn hoạt động.

Service thường có hai loại:

Loại service Mô tả
Started(Được khởi động) Loại dịch vụ này nó sẽ được khởi động khi một thành phần của ứng dụng như Activity. Khởi động nó bằng cách gọi phương thức startService() một khi được gọi thì dịch vụ này có thể chạy ở chế độ nền vô thời hạn thậm chí ngay cả khi thành phần gọi nó đã bị hủy và loại dịch vụ này sẽ không trả về kết quả. Ví dụ như dịch auto update của một phần mềm nào đó khi ứng dụng bị hủy thì dịch vụ đó vẫn chạy và kiểm tra cũng như tải về các bản cập nhật mới nếu có bản cập nhật mới  thì sẽ được tải về khi tải về hoàn tất thì dịch vụ sẽ tự dừng, như bạn thấy dịch vụ có thể hoạt động độc lập với ứng dụng mà không cần bạn phải chạy ứng dụng.

Đây là một dạng dịch vụ không ràng buộc(Unbound)

Bound(Ràng buộc) Một dịch vụ được giàng buộc (Bound) khi một thành phần ứng dụng giàng buộc nó bằng cách gọi bindService().
Một dịch vụ 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ả. Một service ràng buộc có thể chạy với nhiều components ràng buộc đến nó khi chaỵ lần đầu tiên, khi tất cả components của chúng không còn ràng buộc nữa thì service sẽ bị hệ thống hủy. Giống kiểu trạng chết chúa cũng băng hà :D.

Và dịch vụ cũng có một đặc điểm giống với Activity chính là nó cũng có vòng đời của nó.

Vòng đời của dịch vụ

Vòng đời Service

Vòng đời Service

Như bạn thấy trên hình chính là vòng đời của hai loại service.

Và ở đây có một số hàm quan trọng cần cài đặt khi cần khởi tạo một service:

  • onStartCommand(): hệ thống sẽ gọi hàm này khi một component khác hoặc một activity yêu cầu bắt đầu service bằng cách gọi hàm startService(). Nếu bạn chỉ muốn sử dụng service kiểu ràng buộc thì không cần phải cài đặt hàm này.
  • onBind(): hệ thống sẽ gọi hàm này khi một component muốn ràng buộc với service bằng cách gọi hàm bindService(). Khi cài đặt hàm này bạn phải cung cấp giao tiếp giữa client và service bằng cách trả về iBinder. Bạn luôn luôn phải cài đặt hàm này, nếu không muốn ràng buộc bạn có thể trả về null.
  • onCreate(): hệ thống gọi hàm này khi lần đầu tiên service chạy trước khi chạy hàm onStartCommandonBind. Nếu service chạy rồi thì hàm này không được gọi nữa.
  • onDestroy(): hệ thống gọi hàm này khi service không được sử dụng nữa và bạn cần gọi hàm này để giải phóng tài nguyên cần thiết liên quan đến service.

Nếu một component bắt đầu service bằng cách gọi hàm startService() thì nó sẽ chạy cho đến khi chính nó kết thúc với hàm stopSelf() hoặc một component khác gọi hàm stopService() thì service sẽ được hủy bó.

Nếu một component gọi hàm bindService() để tạo service (lúc này onStartCommand() không được gọi), service chỉ chạy với các component ràng buộc với nó. Khi service không còn ràng buộc từ tất cả các client thì hệ thống sẽ hủy nó.

Hệ thống sẽ buộc phải tắt service trong trường hợp bộ nhớ xuống thấp hoặc nó phải phục hồi lại tài nguyên cho các thao tác mà người dùng đang sử dụng. Nếu service ràng buộc bởi activity mà người dùng đang sử dụng thì sẽ ít bị giải phóng hơn hoặc service chạy dưới nền sẽ không bao giờ bị giải phóng. Ngoài ra service bắt đầu trong một khoảng thời gian dài cũng có nguy cơ cao bị hệ thống giải phóng. Nối chung hệ thống sẽ ưu tiên giải phóng service chạy từ lâu > service chạy nền > service ràng buộc.

Ngoài 2 loại dịch vụ trên, có một dịch vụ khác gọi là IntentServiceIntent 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(Dùng một lần rồi bỏ :p).

Sau đây là bảng so sánh các 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 và có thể hoạt động mãi mãi. Bounded Service được sử dụng để thực hiện nhiệm vụ ở nền (background) và giàng buộc với một thành phần giao diện nào đó. 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 phương thức startService(). Bounded Service được khởi động bởi gọi phương thức 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 dịch vụ.
Unbound Service hoạt động độ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 hoạt động độc lập với thành phần đã khởi động nó.

Như vậy là tôi đã giới thiệu với các bạn cơ bản về Service trong Android. Hẹn gặp lại các bạn ở Series Android truyền kì hồi thứ hai Unbound Service cảm ơn các bạn đã quan tâm theo dõi xin chào và hẹn gặp lại.