Service Archives - Cao Đẳng FPT M?ng c c??c bng ? xét tuyển //westview-heights.com/tag/service Cao Đẳng FPT M?ng c c??c bng ? tuyển sinh theo hình thức xét tuyển h?sơ. Tiêu chí đào tạo: Thực học ?Thực nghiệp! Fri, 07 Oct 2022 10:25:22 +0000 vi hourly 1 //wordpress.org/?v=6.4.1 //westview-heights.com/wp-content/uploads/cropped-logo-fpt-32x32.png Service Archives - Cao Đẳng FPT M?ng c c??c bng ? xét tuyển //westview-heights.com/tag/service 32 32 Service Archives - Cao Đẳng FPT M?ng c c??c bng ? xét tuyển //westview-heights.com/tin-tuc-poly/tong-quan-ve-service-trong-he-dieu-hanh-android.html //westview-heights.com/tin-tuc-poly/tong-quan-ve-service-trong-he-dieu-hanh-android.html#respond Fri, 07 Oct 2022 10:25:22 +0000 //westview-heights.com/?p=196607 Service được coi là một trong bốn thành phần lớn của Android, đóng vai trò như một thành phần hết sức quan trọng. Đối với bất c?ai nếu muốn tr?thành một Android Developer thực th?thì bắt buộc ...

The post Tổng quan v?Service trong h?điều hành Android appeared first on Cao Đẳng FPT M?ng c c??c bng ? xét tuyển.

]]>
Service được coi là một trong bốn thành phần lớn của Android, đóng vai trò như một thành phần hết sức quan trọng. Đối với bất c?ai nếu muốn tr?thành một Android Developer thực th?thì bắt buộc phải nắm rõ và hiểu biết sâu v?“Service”.

Trước hết, biểu tượng của Service trong h?điều hành là một robot chiến binh Android với thanh kiếm tượng trưng cho Activity, trong đó có hai chiếc ăng ten được xem là Broadcast Receiver, Intent là cánh tay còn View là đôi chân. Ngoài ra, Content Provider lại giống như một nơi cung cấp nhiên liệu cho robot, cùng với đó là một thành phần nằm trong thân robot tuy nhiên không th?nhìn thấy là Service, s?hữu một chiếc quạt gió chạy liên tục, khi robot chiến đấu hay k?c?khi ng?ngh?thì chiếc quạt vẫn liên tục hoạt động. 

1. Service là 

Một Service là thành phần (component) có th?thực hiện các hoạt động lâu dài trong background và nó không cung cấp một giao diện người dùng nào. Dù vậy, một thành phần khác của ứng dụng này có th?khởi động và nó s?tiếp tục chạy trong background ngay c?khi người dùng chuyển sang ứng dụng khác. Ngoài ra, một thành phần có th?liên kết tùy ý (bind) với một Service đ?tương tác với Service đó, thậm chí là thực hiện truyền thông liên tiến trình IPC (interprocess communication – IPC có th?được hiểu như một hoạt động chia s?d?liệu qua nhiều tiến trình, thông thường s?dụng giao thức truyền thông và phải có Client và Server). Lấy ví d?v?trường hợp điển hình, một Service có th?thực hiện các giao dịch mạng, chơi nhạc, ra vào file I/O hoặc tương tác với một content provider, tất c?đều xuất phát t?background.

2. Phân loại Service 

2.1. Foreground Service

?trong trường hợp này, một Foreground Service có th?thực hiện một s?thao tác mà người dùng d?dàng s?dụng. Ví d? một ứng dụng nghe nhạc có th?chơi một bản nhạc và điều khiển nó bằng Foreground Service. Tuy vậy, một điều bắt buộc là Foreground Service cần phải được cấp quyền hiển th?thông báo và s?tiếp tục chạy ngay c?khi người dùng không tương tác với ứng dụng.

2.1.1 Xây dựng ứng dụng nghe nhạc

Bước 1: Xây dựng giao diện

Bước 2: Ánh x?các view sang file MainActivity.java

Bước 3: Xây dựng layout chơi nhạc

Bước 4: Tạo thông báo và tạo ra 1 class với tên tùy ý

Bước 5: Đăng ký lớp vừa tạo bên trong file AndroidManifest.xml

android:name=”.MyNotificationChangnel”

Bước 6: Chuẩn b?tài nguyên ảnh pause và play trong thư mục drawable. Đồng thời, tạo ra thư mục raw đ?chứa file nhạc mp3

Bước 7: Tạo ra class MySong.java

public class MySong implements Serializable {
private String name;
private String title;
private int img;
private int resouce;

public MySong(String name, String title, int img, int resouce) {
this.name = name;
this.title = title;
this.img = img;
this.resouce = resouce;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public int getImg() {
return img;
}

public void setImg(int img) {
this.img = img;
}

public int getResouce() {
return resouce;
}

public void setResouce(int resouce) {
this.resouce = resouce;
}
}

Bước 8: Tạo ra 2 phương thức trong file MainActivity.java

  • Background Service

C?th? một Background Service s?thực hiện các hoạt động dù không được người dùng chú ý trực tiếp. Ví d? ứng dụng s?dụng một service đ?thu gom b?nh?t?người chơi thì service đó là một Background Service, hoạt động mà người dùng không nhất thiết phải đ?ý.

Bởi những lí do như vậy, Service s?được coi là Background Service nếu không nằm 1 trong 3 trường hợp sau:

  • Ứng dụng của người dùng hiện có Activity hiển th?/span>
  • Ứng dụng của người dùng có Foreground Service đang chạy
  • Ứng dụng của người dùng được kết nối với một ứng dụng Foreground khác, ?đây là phương thức ràng buộc Service bằng cách s?dụng các Content Providers của chúng

2.3. Demo ứng dụng chạy nhạc mà không hiển th?giao diện

Bước 1: Tạo thư mục raw trong res, đưa file nhạc vào thư mục raw

Bước 2: Tạo class MyBackgroundService.java

 

Bước 3: Cài đặt trong file activity_main.xml

Bước 4: Cài đặt trong file MainActivity.java

Bước 5: Khai báo Service trong file AndroidManifest.xml

Ví d?: <service android:name=”.MyBackgroundService”/>

Lưu ý: Background Service s?chạy ổn định trên android O tr?lên

2.4. Bound Service

Một service được gọi là Bound khi một thành phần của ứng dụng ràng buộc với nó bởi lời gọi bindService(). Nó 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 nó, bao gồm: gửi yêu cầu, nhận kết qu?và thậm chí là IPC. Nhìn chung, Bound Service ch?chạy miễn là có một thành phần ràng buộc với nó. Mặc dù có th?có nhiều thành phần ràng buộc với Bound Service cùng lúc, nhưng khi tất c?tháo b?ràng buộc (unbound) thì nó s?hủy b? Bên cạnh đó, Service còn được phân chia là Started Service và Bound Service.

Một Started Service hay là Unbound Service là service được khởi động bằng phương thức startService() t?thành phần khác. Thậm chí, nó s?tiếp tục chạy trong background k?c?khi thành phần khởi tạo nó b?phá hủy và đây cũng được xem là một Background Service theo cách chia trên.

2.4.1. S?dụng Bound Service đ?chơi nhạc

Bước 1: Tạo file layout activity_main.xml

Bước 2: Tạo ra lớp MusicBoundService.java

Bước 4: Tạo thư mục raw và copy file nhạc vào

Bước 5: Khai báo Service trong file AndroidManifest.xm

3. Đ?ưu tiên các loại Service

Xét riêng v?h?điều hành này, Android bắt buộc phải dừng một service khi b?nh?ít và phải khôi phục tài nguyên h?thống cho Activity đang được s?dụng. Nếu Service được ràng buộc với một Activity đang s?dụng thì rất ít kh?năng b?tiêu hủy. Tuy nhiên, nếu Service được khai báo và chạy ?ch?đ?Foreground thì nó cũng khó đ?xóa bớt.

V?trường hợp Service là Started và chạy lâu dài, h?thống s?làm giảm v?trí ưu tiên của nó, bởi vì ph?thuộc vào process thì các loại service s?được xếp theo đ?ưu tiên sau: Bound Service khó b?tiêu hủy nhất, tiếp theo là Foreground Service và Background Service.

Dựa vào những lí do trên, Background Service được coi là Service d?b?tiêu hủy nhất nên cần phải x?lý một cách thích hợp, tùy thuộc vào giá tr?tr?v?trong onStartCommand() mà Service có th?được khởi động lại. 

4. Các giá tr?tr?v?trong onStartCommand().

Khi Service b?h?thống tiêu hủy do thiếu b?nh?thì dưới đây là 5 giá tr?tr?v?thường dùng trong onStartCommand() đ?thông báo với h?thống.

4.1. START_NOT_STICKY

Nếu h?thống tiêu hủy service khi giá tr?này được tr?v?thì service này s?không được khởi động lại tr?khi có một Intent đang được ch??onStartCommand(). Vì vậy, đây là lựa chọn an toàn nhất đ?tránh chạy Service khi không cần thiết và ứng dụng cũng có th?khởi động lại một cách đơn giản các công việc chưa hoàn thành.

4.2. START_STICKY

Giá tr?này được tr?v?trong onStartCommand khi service b?h?thống tiêu hủy. Nếu onStartCommand không có một Intent nào ch?nữa thì Service s?được h?thống khởi động lại với một Intent null.

4.3. START_REDELEVER_INTENT

Nếu Service b?tiêu hủy thì nó s?được khởi động lại với một Intent là Intent cuối cùng mà Service được nhận. Điều này thích hợp với các service đang thực hiện công việc muốn tiếp tục ngay tức thì như download file. 

4.4. START_STICKY_COMPATIBILITY

Giá tr?này cũng giống như START_STICKY nhưng không chắc chắn trong việc đảm bảo khởi động lại service.

4.5. DEFAULT

Là một s?lựa chọn tiềm năng giữa START_STICKY_COMPATIBILITY hoặc START_STICKY

public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) {

                    onStart(intent, startId);

                    return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;

 }

5. Các phương thức quan trọng trong vòng đời Service

Khi tạo một service, chúng ta buộc phải k?thừa lớp Service do Android cung cấp. Tuy nhiên, nếu muốn thực thi thì điều tiên quyết nữa là phải override một vài phương thức quan trọng t?việc x?lý vòng đời của Service và cung cấp một cơ ch?cho phép các thành phần liên kết với Service nếu thích hợp.

5.1. onStartCommand()

H?thống gọi phương thức này khi một thành phần khác như Activity gọi đến Service bằng câu lệnh startService(). Khi phương thức này được thực hiện, dịch v?s?được khởi động và có th?chạy trong background vô thời hạn. Đến một lúc nào đó công việc hoàn thành, chúng ta nên dừng lại bằng cách gọi stopService() t?một thành phần khác, hoặc cho chính Service gọi stopSelf(). Trong trường hợp nếu ch?muốn ràng buộc buộc với Service thì không nên s?dụng onStartCommand().

5.2. onBind()

H?thống s?gọi phương thức này khi một thành phần khác gọi đến Service bằng câu lệnh bindService(). Khi triển khai phương thức này, yêu cầu bắt buộc là phải cung cấp một giao diện đ?client có th?giao tiếp với Service thông qua một đối tượng IBinder do Service tr?v? Dù khi k?thừa t?lớp Service của Android phải luôn luôn override phương thức này, nhưng nếu không muốn ràng buộc (bind) thì chúng ta hoàn toàn có th?return null.

5.3. onCreate()

Nói một cách khái quát, h?thống gọi phương thức này khi Service được khởi tạo và nó ch?chạy một lần trước khi onStartCommand() hoặc onBind() được gọi. Nếu Service đã chạy thì phương thức này s?không được gọi lại lần nào nữa.

5.4. onDestroy()

H?thống gọi phương thức trên khi Service không được s?dụng nữa và đang b?hủy (destroy). Lúc này, chúng ta cũng nên giải phóng tài nguyên như các Threads, Listeners hay Receivers ?

6. Khi Started và Bound Service chạy đồng thời

Như chúng ta đã biết, StartedService được start bằng lời gọi startService() t?một thành phần nào đó và nó s?ch?dừng lại khi thành công gọi stopSelf() hoặc một thành phần gọi stopService(). V?phần Bound Service, nó s?được khởi chạy khi một thành phần gọi bindService() và dừng lại khi tất các các thành phần ràng buộc (bind) với nó hủy liên kết (unbind). Ngược lại, nếu Started Service gọi stopSelf() hoặc được gọi stopService() mà service vẫn chưa vào onDestroy thì cần một điều kiện nữa đ?nó b?hủy trong tình huống các thành phần ràng buộc với BoundService chưa hủy hết liên kết. Bên cạnh đó, nếu tất c?các thành phần ràng buộc với Bound Service unbind thì Service cũng chưa được hủy cho đến khi Started Service t?gọi stopSelf() hoặc được gọi stopService(). Lúc này, điều kiện cần là c?hai loại service đều được hủy thì Service mới được hủy.

Vòng đời của Bound Service khi chạy cùng với một Started Service

Như vậy, thông qua những kiến thức trên đã giải thích khá chi tiết v?Service trong h?điều hành Android, đồng thời cũng là nền tảng vô cùng quan trọng đối với Android Developer. 

B?môn CNTT

Cao đẳng FPT M?ng c c??c bng ? Hà Nội

The post Tổng quan v?Service trong h?điều hành Android appeared first on Cao Đẳng FPT M?ng c c??c bng ? xét tuyển.

]]>
//westview-heights.com/tin-tuc-poly/tong-quan-ve-service-trong-he-dieu-hanh-android.html/feed 0