Mục lục
- Mục lục
- Java đã chết, Kotlin trường tồn
- Jetpack
- Kotlin Coroutines
- Asynchronous Flow
- App Architecture
- Material Design
- User Experience
- Example App
- Free Resources
- Tổng kết

Trong bài viết ngắn này, tôi tóm tắt một số đề xuất cũng như thực tiễn tốt nhất và phổ biến mới dành cho nhà phát triển ứng dụng Android. Hãy thoải mái sử dụng chúng khi bạn xây dựng một dự án greenfield mới hoặc khi bạn muốn loại bỏ giao diện cũ khỏi các ứng dụng hiện có của mình.
Java đã chết, Kotlin trường tồn
Nếu bạn thực sự không biết thì đã vài năm trôi qua kể từ khi Google thông báo rằng việc phát triển Android sẽ ưu tiên Kotlin lên hàng đầu. Kotlin không chỉ an toàn hơn, được thiết kế tốt hơn và ít dài dòng hơn Java mà không có Kotlin trong cơ sở mã của bạn, bạn sẽ không thể sử dụng các công cụ và thư viện hiện đại như Jetpack Compose hoặc lập trình không đồng bộ bằng Coroutines.

Jetpack
Android Jetpack là gì?
Jetpack là một bộ các thư viện được Google giới thiệu từ tháng 5 năm 2018. Android Jetpack là một tập hợp các components, tools giúp bạn nhanh chóng tạo ra các ứng dụng Android tuyệt vời. Các components này kết hợp giữa Support Library và Architecture Components.
Có thể phân loại Android Jetpack thành 4 thành phần chính:
- Foumdation components (Ví dụ: ktx, appcompat, multidex, test)
- Architecture components (Ví dụ: Data Binding, Lifecycles, ViewModel, Livedata, Room, Paging, Navigation, WorkManager)
- Behavior components (Ví dụ: Download manager, Media, Notifications, Permissions, Sharing, Slices)
- UI components (Ví dụ: Animations, Auto, Emoji, Fragment, Layout, Palette, TV, Wear OS )

Nên nhớ đây chỉ là mô hình ở lần giới thiệu đầu tiên của Google về Jetpack. Những thư viện được đánh dấu là new! là những thứ mới toanh từ ngày ra mắt, số còn lại thì đã có sẵn rồi.
Một năm sau đó, Google bổ sung vào bộ sưu tập Jetpack này một loạt thư viện nữa. Bao gồm CameraX hay các thư viện nâng cấp cho các thư viện trước đây. Và đặc biệt, thời gian này còn có một khái niệm mới ra đời, đó là Jetpack Compose (đây là gì thì mình sẽ có loạt bài viết riêng, mặc dù chúng cũng nằm trong họ Jetpack nhưng kiến thức về chúng là rất nhiều, do đó mình phải tách ra nói riêng thôi).
Ưu điểm của Android Jetpack
- 1. Tính “mở”: Để hiểu kỹ hơn và trả lời câu hỏi Android Jetpack là gì? thì hãy xem xét: Các Android Jetpack components được cung cấp dưới dạng các thư viện “mở”, không phải là một phần của nền tảng Android cơ bản. Điều này có nghĩa là bạn có thể dễ dàng áp dụng từng component.
Mỗi khi Android Jetpack có thêm một tính năng mới, bạn có thể dễ dàng thêm nó vào trong ứng dụng của mình, triển khai ứng dụng trên Play Store và cung cấp cho người dùng tất cả các tính năng mới chỉ trong một ngày. Các thư viện mở sẽ được chuyển vào androidx.* namespace mới.
- 2. Tính tương thích ngược: Ngoài ra, ứng dụng của bạn có thể chạy mượt mà trên nhiều phiên bản của Android mà không lo lắng về tính tương thích. Tại sao ư?
Vì đơn giản là Android Jetpack được xây dựng dựa trên Support Library. Mà các thư viện này được các nhà phát triển Android tạo ra để cung cấp các chức năng độc lập với các phiên Android, và có tính tương thích ngược rất tốt.
Ví dụ như: Ứng dụng của bạn sử dụng Fragment mà lại muốn hỗ trợ Android 3.0 trở xuống? Chính là lúc bạn nghĩ tới Support Library đấy.
-
3. Dễ dàng testing: Hơn nữa, Android Jetpack còn có thiết kế rất tốt cho việc testing. Nó tách biệt giữa phần chức năng và phần test. Điều này giúp bạn dễ dàng kiểm tra, nâng cao chất lượng ứng dụng.
-
4. Các component độc lập với nhau: Mặc dù các components của Android Jetpack được xây dựng để hoạt động cùng nhau. Ví dụ: lifecycle awareness và live data.
Tuy nhiên, bạn không phải bắt buộc phải sử dụng tất cả chúng. Bạn có thể tích hợp từng phần của Android Jetpack để giải quyết một vấn đề của bạn. Điều này giúp cho ứng dụng trở nên nhẹ nhàng.
Lợi ích của Android Jetpack
-
Tăng hiệu suất phát triển: Android Jetpack giúp giảm thiểu công việc lặp lại và tăng tốc quá trình phát triển. Các thành phần đã được xây dựng sẵn và tuân theo các chuẩn tốt nhất, giúp nhà phát triển tiết kiệm thời gian và tập trung vào việc sáng tạo.
-
Dễ bảo trì và mở rộng: Với kiến trúc rõ ràng và các thành phần tương tác tốt với nhau, việc bảo trì và mở rộng ứng dụng trở nên dễ dàng hơn, giúp duy trì chất lượng và tính năng của ứng dụng.
-
Hỗ trợ phiên bản Android đa dạng: Android Jetpack cung cấp các công cụ giúp ứng dụng hoạt động mượt mà trên nhiều phiên bản Android khác nhau, từ các phiên bản cũ hơn đến các phiên bản mới nhất.
-
Tăng trải nghiệm người dùng: Nhờ vào các thành phần Behavior như Navigation và Paging, Android Jetpack giúp tạo ra trải nghiệm người dùng tốt hơn, dễ dàng điều hướng và tiếp cận nội dung.
What’s new in Jetpack?
I. Architecture
Các thành phần ở nhóm này sẽ tập trung vào việc làm sao có thể xây dựng một ứng dụng nhanh chóng, dễ dàng kiểm lỗi cũng như dễ bảo trì, sữa chữa sau này. Có thể kể đến các thành phần này bao gồm Data Binding, Lifecycles, LiveData, Navigation, Paging, Room, ViewModel, WorkManager, ….
1. Data Binding
2. Lifecycles
Quản lý vòng đời Activity và fragment
3. LiveData
Notify views khi dữ liệu bên dưới thay đổi
4. Navigation
Handle tất cả các chức năng liên quan tới Navigation
Trong khi Activity trong Android được cung cấp để bạn dễ dàng tạo và tương tác với người dùng thông qua UI. Nhưng nó lại không linh hoạt trong việc chia sẻ dữ liệu và chuyển đổi giữa các Activity.
Chính vì vậy mà Activity trở thành một cấu trúc kém lý tưởng để xây dựng điều hướng trong ứng dụng.
Vì vậy, Google I/O 18 đã giới thiệu Navigation component dưới dạng một famework. Navigation component giúp cho bạn dễ dàng tạo điều hướng trong ứng dụng.
Với khả năng hỗ trợ Fragment, bạn sẽ nhận được tất cả các lợi ích từ Architecture Components như Lifecycle và ViewModel trong khi Navigation sẽ xử lý sự phức tạp của FragmentTransilities giùm bạn.
Mình có thể liệt kê một số tính năng hay ho của Navigation component như:
- Hỗ trợ hiệu ứng khi bạn điều hướng giữa các màn hình.
- Tự động xây dựng các hành vi Up và Back.
- Hỗ trợ đầy đủ cho các liên kết sâu (Deep link)
- Cung cấp công cụ để kết nối Navigation vào các tiện ích UI thích hợp. Như navigation drawer và Bottom Navigation
Cuối cùng, trình chỉnh sửa Navigation Editor trong Android Studio 3.2 còn cho phép bạn xem và quản lý các navigation properties của mình một cách rất trực quan.
- Android Navigation Component
- Navigation in Jetpack Compose
- Codelabs - Navigate between screens with Compose
- Effortless Navigation with Compose
- Navigation Basics in Jetpack Compose
- Full Guide to Nested Navigation Graphs in Jetpack Compose
- Modular Navigation with Jetpack Compose
- Nested Navigation Graph in Jetpack Compose with Bottom Navigation
5. Paging
Phân trang theo yêu cầu từ data source
Thông thường, người ta sẽ không tải toàn bộ dữ liệu và hiển thị ra màn hình. Vì điều đó sẽ vừa tốn thời gian lấy dữ liệu, vừa tốn thời gian và tài nguyên để hiển thị. Do vậy, người ta chỉ tải từng phần của dữ liệu. Đây chính là khái niệm paging.
Paging component giúp việc tải dữ liệu trở nên dễ dàng. Đồng thời giúp việc hiển thị các tập dữ liệu lớn với tốc độ cuộn nhanh hơn, không giới hạn với RecyclerView.
Paging component có thể tải dữ liệu phân trang từ bộ nhớ cục bộ, mạng hoặc cả hai. Nó hoạt động hiệu quả hơn hẳn so với Room, LiveData và RxJava.
6. Room
Hỗ trợ truy cập và điều khiển dễ dàng hơn trong SQLite database
7. ViewModel
Quản lý dữ liệu liên quan đến giao diện người dùng theo vòng đời
8. WorkManager
Quản lý các công việc trong Android background
WorkMananager component là một thư viện cung cấp giải pháp giúp cho các tác vụ chạy nền( background task) được hiệu quả hơn.
Đưa một nhiệm vụ cho WorkManager và để cho nó chọn một cách thích hợp để chạy nó trong nền tùy theo điều kiện. Nó thay thế những thứ như jobs hoặc SyncAdapters.
WorkManager cung cấp một API có khả năng làm việc trên các thiết bị có hoặc không có Google Play Services.
Ngoài ra, WorkManager còn có khả năng tạo biểu đồ công việc và truy vấn trạng thái công việc của bạn.
II. Foundation
Foundation components cung cấp core system capabilities, các extensions của Kotlin cùng với việc hỗ trợ multidex và automated testing.
Các thành phần ở nhóm này được gọi là các thành phần nền tảng. Cũng như tên gọi, chúng sẽ là các thư viện giúp tác động đến nền tảng của Android, như thư viện tương thích ngược, các thư viện hỗ trợ Kotlin cũng như hỗ trợ cho việc testing. Chúng bao gồm App Compat, Android KTX, Multidex, Test, ….
1. AppCompat
Tương thích ngược với các phiên bản cũ của android
2. Android KTX
Viết code Kotlin ngắn gọn, dễ hiểu hơn
Android KTX cho phép bạn chuyển đổi mã Kotlin từ như thế này:
view.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
actionToBeTriggered()
return true
}
});
thành mã ngắn gọn hơn rất nhiều:
view.doOnPreDraw { actionToBeTriggered() }
3. Multidex
Cung cấp khả năng hỗ trợ cho apps apps với multiple DEX files
4. Test
Framwork cho Android testing bao gồm unit và runtime UI tests
III. UI
Nó giúp chúng ta xây dựng nên ứng dụng với giao diện đẹp hơn, chuyên nghiệp hơn và sáng sủa hơn. Như Animation and transitions, Auto, Emoji, Fragment, Layout, Palette, TV, Wear, ….
1. Animation and transitions
Di chuyển widgets và các transition giữa các màn hình
2. Auto
Thành phần giúp phát triển ứng dụng cho Android Auto.
3. Emoji
Kích hoạt và cập nhật các emoji cho các nền tảng cũ
4. Fragment
Một thành phần cơ bản trong UI
5. Layout
Bố trí các widgets bằng cách sử dụng thuật toán khác nhau
6. Palette
Trình chọn màu
7. TV
Thành phần giúp phát triển ứng dụng cho Android TV.
8. Wear OS by Google
Thành phần giúp phát triển ứng dụng cho Wear.
IV. Behavior
Các thành phần ở nhóm này sẽ giúp ứng dụng của chúng ta có thể kết nối dễ dàng đến các dịch vụ của hệ thống. Bao gồm Download Manager, Media & Playback, CameraX, Notifications, Permissions, Preferences, Sharing, Slices, ….
Download manager
Đặt lịch & quản lý các tác vụ tải xuống
1. Media and playback
Hỗ trợ tương thích ngược cho việc phát media và routing (bao gồm cả Google Cast)
2. Notifications
Cung cấp các API tương thích ngược cho việc hiển thị thông báo, hỗ trợ cả Wear và Auto
3. Permissions
Cung cấp các API cho việc kiểm tra và yêu cầu các quyền trong android
4. Sharing
Cung cấp các hành động chia sẻ phù hợp với action bar của ứng dụng
5. Slices
Tạo các UI linh hoạt có thể hiển thị dữ liệu ứng dụng bên ngoài ứng dụng.
Để hoàn thiện bộ các tính năng mới ra mắt của Android Jetpack thì không thể không nhắc đến Slices component.
“Slice” là cách để hiển thị UI của ứng dụng bên trong Google Assistant.
Jetpack Compose
Jetpack Compose là bộ công cụ hiện đại được Android khuyên dùng để xây dựng giao diện người dùng gốc. Nó đủ trưởng thành và cho phép bạn xây dựng giao diện người dùng dễ dàng hơn, nhanh hơn và ít mã hơn. Hơn nữa, bố cục XML dựa trên Soạn thảo và Chế độ xem có thể được kết hợp. Bạn có thể thêm giao diện người dùng Compose vào một ứng dụng hiện có sử dụng thiết kế dựa trên Chế độ xem hoặc bao gồm hệ phân cấp Chế độ xem Android trong giao diện người dùng Compose. Cách tiếp cận này đặc biệt hữu ích nếu bạn muốn sử dụng các thành phần giao diện người dùng chưa có trong Compose, như AdView hoặc MediaPlayer. Khi bạn bắt đầu một dự án mới, không có lý do gì để sử dụng bố cục XML nữa.
- MDC for Android
- 25 Videos - Jetpack Compose
- 35 Videos - Jetpack Compose
- 93 Videos - Jetpack Compose
- Android - Jetpack Compose
- Cơ bản về Jetpack Compose
- Jetpack Compose - UI Framework mới của Android
- Sử dụng Jetpack Compose để dựng UI trong Android
- Sử dụng Jetpack Compose cho project Android với mô hình MVVM
- Jetpack Compose cho người mới bắt đầu
- Jetpack Compose Tutorial - Step by Step Guide
- Tản mạn về Jetpack Compose - Phần I
- Tản mạn về Jetpack Compose - Phần II
- Codelabs - Navigate between screens with Compose
- Effortless Navigation with Compose
- Navigation Basics in Jetpack Compose
- Full Guide to Nested Navigation Graphs in Jetpack Compose
- Migrate Jetpack Navigation to Navigation Compose
Kotlin Coroutines
Lập trình không đồng bộ hoặc không chặn là một phần quan trọng trong quá trình phát triển Android. Bạn phải xử lý những vấn đề không đồng bộ mỗi khi bạn muốn thực hiện các thao tác I/O hoặc các phép tính mở rộng. Kotlin giải quyết vấn đề này một cách linh hoạt bằng cách cung cấp hỗ trợ coroutine ở cấp độ ngôn ngữ và ủy quyền hầu hết chức năng cho các thư viện. Không cần phải tự mình triển khai logic luồng hoặc khởi động AsyncTask nữa. Nếu bạn tìm thấy một hướng dẫn sử dụng những thứ như vậy, hãy chắc chắn rằng nó rất cũ.
Asynchronous Flow
Luồng không đồng bộ không có gì mới. Bạn có thể quen thuộc với các thư viện như RxJava/RxAndroid triển khai lập trình không đồng bộ với các luồng có thể quan sát được. Tuy nhiên, API này quá phức tạp đối với hầu hết các trường hợp sử dụng và quá trình học tập rất khó khăn. Tôi đã trải nghiệm các dự án trong đó các luồng Rx được liên kết theo cách phức tạp đến mức việc thực hiện các thay đổi đơn giản chỉ mất vài ngày thay vì vài phút. May mắn thay, chúng tôi đã có Kotlin Flow, một thư viện luồng không đồng bộ mới của JetBrains, công ty phát triển ngôn ngữ Kotlin. Có nhiều điểm tương đồng với luồng Rx, Kotlin Flow được xây dựng dựa trên Kotlin Coroutines. Nó triển khai nhiều toán tử nổi tiếng mà bạn có thể biết từ thế giới Rx và đơn giản hóa việc làm việc với các luồng không đồng bộ. Hãy ngừng sử dụng RxJava và yêu thích Flow!
App Architecture
Thiết kế kiến trúc ứng dụng là một yếu tố quan trọng cần cân nhắc để đảm bảo rằng ứng dụng của bạn mạnh mẽ, có thể kiểm thử và bảo trì. Google không phải lúc nào cũng quan tâm nhiều đến Kiến trúc ứng dụng. May mắn thay, điều này đã thay đổi và hiện chúng tôi đã có hướng dẫn chính thức về cấu trúc ứng dụng. Hướng dẫn thảo luận về các khái niệm như phân tách mối quan tâm, các lớp ứng dụng khác nhau, mô-đun hóa hoặc chèn phần phụ thuộc. Đọc toàn bộ hướng dẫn trước khi viết một dòng mã!
Material Design
Mã của bạn phải rõ ràng nhưng đối với Giao diện người dùng thì điều đó đúng gấp đôi vì nó hiển thị cho người dùng. Không dễ để thiết kế một ứng dụng vừa đẹp vừa có chức năng. May mắn thay, chúng tôi có Material Design, một hệ thống thiết kế được xây dựng và hỗ trợ bởi các nhà thiết kế và nhà phát triển của Google. Material Design cung cấp rất nhiều thành phần, bố cục, hoạt ảnh và biểu tượng sẵn sàng để sử dụng hoặc tùy chỉnh theo nhu cầu của bạn. Người dùng đã quen thuộc với các thành phần như Nút hành động nổi hoặc Ngăn điều hướng, không có lý do gì để phát minh ra những cách khác nhau để thực hiện những việc tương tự. Ngoài ra, đừng quên nói với nhóm thiết kế của bạn rằng Ứng dụng Android không nên trông giống bản sao pixel hoàn hảo của ứng dụng iOS!
User Experience
Thiết bị di động có một số hạn chế cụ thể như không gian màn hình nhỏ, hiệu suất hạn chế, dung lượng pin hoặc kết nối internet không ổn định. Dựa trên những hạn chế này, tôi có thể cung cấp cho bạn một vài gợi ý về những điều cần ghi nhớ. Ví dụ:
- Ứng dụng phải có thể thực hiện tất cả hoặc một phần quan trọng của chức năng cốt lõi mà không cần truy cập Internet.
- Ứng dụng phải duy trì trạng thái và thông tin đầu vào của người dùng. Hệ thống Android có thể tắt ứng dụng của bạn bất cứ lúc nào. Người dùng thường không muốn viết tin nhắn trò chuyện dài hai lần vì họ xoay màn hình hoặc chuyển đổi giữa các ứng dụng.
- Ứng dụng sẽ hiển thị rõ ràng trạng thái của nó. Người dùng sẽ biết khi nào nút được nhấn, tệp vẫn đang tải lên hay có xảy ra lỗi nào đó không.
- Màn hình di động nhỏ, loại bỏ sự phân tâm, tập trung vào một việc một lúc và làm tốt việc đó. Chia các quy trình nhiều bước thành nhiều màn hình hơn.
Nguyên tắc chung là cố gắng không làm người dùng thất vọng. Nếu bạn làm đúng mọi thứ, ứng dụng có UX chất lượng cao sẽ là kết quả công việc của bạn.
Example App
Tôi đang làm việc trong một dự án nguồn mở nhỏ nơi tôi sẽ triển khai các phương pháp hay nhất đã đề cập.
Bạn có thể tìm thấy nó ở đây: https://github.com/jurajkusnier/stock-browser
Bản thân ứng dụng này rất đơn giản. Nó tải dữ liệu thị trường từ nhiều API của bên thứ 3 và lưu trữ chúng trong cơ sở dữ liệu cục bộ. Sau đó nó cho phép người dùng tìm kiếm, duyệt và đánh dấu các mục yêu thích.
Ứng dụng sử dụng mẫu kiến trúc MVI (Model View Intent), được triển khai bằng thư viện Orbit-MVI. Mỗi màn hình có ViewModel và ScreenState phù hợp. ViewModel đại diện cho nguồn gốc của màn hình. Nó xử lý tất cả thông tin đầu vào của người dùng và trả về trạng thái giao diện người dùng tương ứng được hiển thị trên màn hình. Ngoài trạng thái, ViewModel còn có thể tạo ra các tác dụng phụ được sử dụng chủ yếu để điều hướng giữa các màn hình. ViewModel gọi các trường hợp sử dụng khác nhau để hiển thị dữ liệu cho người dùng. Logic để tải và lưu dữ liệu từ các tài nguyên khác nhau được thực hiện bởi các kho lưu trữ và nguồn dữ liệu.

Free Resources
Tôi thực sự khuyên bạn nên xem khóa học miễn phí này của Google về Phát triển ứng dụng Android bằng Kotlin. Bạn cũng có thể bắt đầu với khóa học miễn phí này trên trang dành cho nhà phát triển Android, nơi các khái niệm được giảng dạy với sự trợ giúp của các phòng thí nghiệm mã, dự án và câu đố, đồng thời bạn cũng kiếm được huy hiệu khi biết các khái niệm đó xuất hiện trên hồ sơ nhà phát triển Google của mình. Ngoài ra, đây là một số tài nguyên để tìm hiểu thêm về các chủ đề được liệt kê ở trên.
- Udacity - Phát triển ứng dụng Android với Kotlin
- Kiến thức cơ bản về Android trong Kotlin
- Hướng dẫn dành cho nhà phát triển Android
- Kodeco
- How to Build an Android App in 2023
Training courses
For beginners
- Android Basics with Compose
- Unit 1: Your first Android app
- Unit 2: Building app UI
- Unit 3: Display lists and use Material Design
- Unit 4: Navigation and app architecture
- Unit 5: Connect to the internet
- Unit 6: Data persistence
- Unit 7: WorkManager
- Unit 8: Views and Compose
- Android Basics in Kotlin
For experienced Android developers
- Jetpack Compose for Android developers
- Modern Android app architecture
- Make your Android app more accessible
- Use coroutines in common Android use cases
Kotlin language training
For Android Java developers
Certification and degree programs
Tổng kết
Cảm ơn bạn đã đọc. Nếu bạn thích bài viết này, hãy thích, để lại phản hồi và chia sẻ nó với bạn bè của bạn. Happy coding - Lập trình vui vẻ!
Tham khảo
- Developing Android App in 2023
- Introduction to Android Jetpack
- Android Jetpack Compose – Interoperability Using Compose in XML Layouts
- Android Jetpack là gì? Tại sao bạn nên biết
- Thông Thạo Jetpack – Phần 1 – Jetpack Là Gì?
- Thông Thạo Jetpack – Phần 2 – Android KTX
- Thông Thạo Jetpack – Phần 3 – Navigation
- Thông Thạo Jetpack – Phần 4 – Navigation (Tập 2)
- Thông Thạo Jetpack – Phần 5 – Navigation (Tập 3)
- Thông Thạo Jetpack – Phần 6 – Navigation (Tập Cuối)
- Modern Android Architectures – MVC/MVP/MVVM – Phần 1: Giới Thiệu Các Mô Hình Kiến Trúc
- Modern Android Architectures – MVC/MVP/MVVM – Phần 2: Kiến Trúc MVC
- Modern Android Architectures – MVC/MVP/MVVM – Phần 3: Kiến Trúc MVP
- Cơ Bản – Bài Học Theo Chương Trình (36B)
- Phát triển ứng dụng Android - 34 điều tôi đã rút ra được kinh nghiệm
- Android Adaptive Launcher Icon – Tất Cả Thông Tin Bạn Cần Biết