Phát triển ứng dụng Android năm 2023

Developing Android App in 2023

Posted by Juraj Kušnier on October 10, 2023. 15 min read.

Mục lục

Android

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.

Kotlin-first

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 )

Jetpack

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.

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.

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.

Android

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.

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

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