Bài 3: Các thành phần cơ bản trong một ứng dụng Android - Lập trình Android cơ bản

Đăng bởi: Admin | Lượt xem: 6594 | Chuyên mục: Android


1. Giới thiệu chung về các component trong Android

Như hình vẽ bên dưới các bạn có thể thấy một robot chiến binh Android có thanh kiếm là tượng trưng cho Activity, có hai chiếc ăng ten có thể xem là Broadcast Receiver, Intent là cánh tay, View là đôi chân. Content Provider giống như một nơi cung cấp nhiên liệu cho robot chẳng hạn. Một thành phần cũng nằm trong thân robot không thể nhìn thấy nữa là Service, là 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 này vẫn chạy. 
Trong bài viết này chúng ta sẽ lần lượt tìm hiểu về các component, các khái niệm cơ bản và công dụng của chúng.

2. Views

Các thành phần giao diện xây dựng từ lớp cơ sở View (android.view.View) của Android, các thành phần này cung cấp sẵn khá đa dạng như Button, TextView, CheckBox ... tất cả chúng ta gọi nó là View. Sơ đồ các View được mộ tả theo sơ đồ như hình dưới.
View biểu diễn một hình chữ nhật, trong đó nó hiện thị thông tin nào đó cho người dùng, và người dùng có thể tương tác với View. Nhưng loại View cơ bản cần tìm hiểu trước tiên đó là: TextView, ImageView, Button, ImageButton, EditText.

2.1 ViewGroup

Trong sơ đồ trên, có một lớp abstract kế thừa từ View là ViewGroup, nó cũng chính là một View nhưng có khả năng chứa các View khác bên trong (kể cả ViewGroup khác). Nó là lớp cơ sở để xây dựng nên các layout như trên sơ đồ ta thấy có: ConstraintLayout, RelativeLayout, LinearLayout, GridLayout, FrameLayout.
Android có sẵn nhiều loại View, ViewGroup, Layout mà ở chế độ Design bạn có thể kéo thả để xây dựng giao diện
Các ViewGroup cũng như một phần tử chứa các View con, và ViewGroup cũng được kế thừa trở thành phần gốc để xây dựng UI gọi là layout.

2.2 Các layout

Các layout chính là các View (cụ thể nó kế thừa thừa ViewGroup) được thiết kế với mục đích chứa các View con và điều khiển, sắp xếp vị trí các View con đó trên màn hình, mỗi layout có cơ chế điều khiển vị trí View con riêng của mình. Có một số layout mà bạn tham khảo trước tiên như FrameLayout, ConstraintLayout, LinearLayout, RelativeLayout, GridLayout, TableLayout, CoordinatorLayout.... 
Vấn đề này mình sẽ nói kỹ ở các bài sau.

2.3 Hệ thống cấp bậc các View

Mỗi View trong hệ thống giao diễn được biểu diễn bởi một hình chữ nhật, nó vẽ trên nó thông tin gửi tới người dùng cũng như là nơi để nhận thông tin nhập vào như nhập dữ liệu, chạm, vuốt. Một giao diện người dùng được bắt đầu bằng một View gốc, bên trong nó chứa các View con, đến lượt các View con lại có thể chứa các View con khác ... Cứ như vậy, giao diện hình thành được biểu diễn như một đồ thị dạng cây nhiều nhánh (view hierarchy).

3. Activities

Activity là một thành phần của ứng dụng Android. Android Activity là nơi để ứng dụng tương tác trực tiếp với người dùng thông qua giao diện. Một ứng dụng có thể sẽ có nhiều màn hình và mỗi màn hình có thể là một Activity (nếu không sử dụng Fragment).
Mỗi Activity thường hoạt động độc lập với nhau nhưng có thể tương tác và truyển dữ liệu qua nhau thông qua Intent. Chính vì Activity hoạt động độc lập nên sẽ có vòng đời riêng từ lúc được khởi tạo cho đến lúc được huỷ đi.
Thoạt đầu bạn sẽ thắc mắc: với ứng dụng nhiều màn hình mà được thiết kế tương ứng với nhiều Activity thì xây dựng ứng dụng khó lắm à? Chưa kể nghe nói mỗi Activity lại có vòng đời riêng nữa? Mình phải tự viết code để xử lý vòng đời Activity sao?
Đừng quá lo lắng! Android sẽ xử lý vấn đề đó cho bạn. Trong Android, người ta đã định nghĩa sẵn các callback tương ứng với từng trạng thái của vòng đời Activity rồi. Công việc của bạn là viết code xử lý logic của ứng dụng vào thôi.
Việc xử lý logic tương ứng với từng trạng thái của Activity là việc rất quan trọng. Điều đó đảm bảo ứng dụng hoạt động ổn định và đáng tin cậy với người dùng. Bạn có thể tham khảo hình ảnh minh họa vòng đời Activity.

4. Intents

Trong Android, khả năng gửi tin nhắn đi xung quanh được thực hiện bởi đối tượng Intent. Với sự trợ giúp của Intents, các thành phần của Android có thể yêu cầu chức năng từ các thành phần khác. Khi bạn mở ứng dụng Instagram trên điện thoại của bạn và sử dụng nó để chụp ảnh, bạn chỉ cần sử dụng một Intent.
Intent cũng giúp liên lạc giữa các phần của một ứng dụng dễ dàng. Di chuyển từ một màn hình (Activity) sang một màn hình khác được thực hiện thông qua Intents.
Bạn hãy nhìn nhận theo cách này : tất cả các thành phần (ứng dụng và màn hình) của thiết bị Android đều bị cô lập. Cách duy nhất chúng giao tiếp với nhau là thông qua Intents.
Android hỗ trợ hai loại Intent : minh bạch và ngầm. Khi một ứng dụng định nghĩa thành phần đích của nó trong một Intent, đó là một Intent minh bạch. Khi ứng dụng không đặt tên cho một thành phần đích, đó là một Intent ngầm.

5. Broadcast - receiver

Đã bao giờ bạn tự hỏi hệ thống Android làm cách nào mà có thể nhận biết được tất cả những sự thay đổi của hê thống như lắng nghe tin nhắn đến, hành động rút - cắm sạc, hay hành động bật tắt mạng,... đó chính xác là hệ thống sử dụng Broadcast Receiver để làm. Vậy chúng ta đi vào tìm hiểu Broadcast Receiver là gì.
1. Broadcast Receiver là một trong 4 component lớn trong Android, với mục đích là lắng nghe các sự kiện, trạng thái của hệ thống phát ra thông qua Intent nhờ đó mà các lập trình viên có thể xử lí được các sự kiện hệ thống ở bên trong ứng dụng của mình.
2. Broadcast Receiver có thể hoạt động được cả khi ứng dụng bị tắt đi, nghĩa là ở background chính vì vậy nó thường được sử dụng với service.

6. Services

Một Service là một 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. Một thành phần khác của ứng dụng có thể start nó, và nó 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 (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 bạn có thể hiểu là 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à nó phải có Client và Server). Ví dụ: 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 từ background.

2. Phân loại Service

Theo trang chủ developer.android.com thì Service được chia làm 3 loại khác nhau:
2.1 Foreground Service
Một Foreground Service thực hiện một số thao tác mà người dùng chú ý, có thể thấy rõ ràng. Ví dụ một ứng dụng nghe nhạc có thể chơi một bản nhạc và control nó bằng Foreground Service. Một điều bắt buộc là Foreground Service phải hiện thị một Notification. Foreground Service 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.2 Background Service
Một Background Service sẽ thực hiện các hoạt động mà không được người dùng chú ý trực tiếp. Ví dụ một ứng dụng sử dụng một service để thu gom bộ nhớ chẳng hạn thì service là một Background Service, hoạt động mà người dùng không cần thiết phải để ý.
2.3 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(). Một Bound Service 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ó: gửi yêu cầu, nhận kết quả và thậm chí là IPC. Một Bound Service chỉ chạy miễn là có một thành phần ràng buộc với nó. 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ẽ Destroy. Trước đây Service thường được 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. Và 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. Đây cũng là xem là một Background Service theo cách chia trên.

7. Content provider

Content provider là một thành phần để quản lý truy cập dữ liệu, nó cung cấp các phương thức khác nhau để các ứng dụng có thể truy cập dữ liệu từ một ứng dụng khác bằng cách sử dụng ContentResolver. Content Provider có thể giúp cho một ứng dụng quản lý quyền truy cập đến dữ liệu được lưu bởi ứng dụng đó, hoặc các ứng dụng khác, và đó là một cách để ta có thể chia sẻ dữ liệu cho các ứng dụng khác nhau. Hình dưới đây biểu diễn cho việc cách content providers quản lý việc truy cập tới bộ nhớ.
Content Provider điều phối việc truy cập tới bỗ lưu trữ dữ liệu thông qua các API và các component như hình dưới, nó bao gồm :
  1. Chia sẻ dữ liệu từ ứng dụng của bán tới các ứng dụng khác
  2. Gửi dữ liệu sang widget
  3. Trả về một kết quả gợi ý khi search cho ứng dụng của bạn thông qua Seach Framework sử dụng SearchRecentSuggestionsProvider
  4. Đồng bộ dữ liệu của ứng dụng với server bằng cách sử dụng AbstractThreadedSyncAdapter
  5. Tải dữ liệu lên UI sử dụng CursorLoader
Content Provider hoạt động rất giống với một cơ sở dữ liệu, bạn có thể truy vấn, chỉnh sửa nội dung, cũng như là thêm xóa các nội dung sử dụng các phương thức: insert(), update(), delete(), query().
Bài tiếp theo: Activity >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!