Activity trong Android – Phần 1: Vòng đời của Activity

21
Dịch vụ dạy kèm gia sư lập trình
Bài này thuộc phần 6 của 16 phần trong series Tự học lập trình Android trong 24 giờ

Chúng ta sẽ tiếp tục tìm hiểu Activity, một thành phần đặc biệt quan trọng của ứng dụng Android. Activity trong Android là nơi diễn ra mọi hoạt động tương tác với người dùng, bởi vì tất cả các màn hình ứng dụng đều phải được “đính” trên một Activity.

Activity là một trong 4 thành phần quan trọng của ứng dụng Android gồm: Activity, Service, Content Provider, Broadcast receivers.

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách làm việc với Activity. Để bài viết dễ hiểu và không lý thuyết xuông, mình sẽ cùng nhau xây dựng một ứng dụng nhắc nhở công việc: Forget Me not ( Tạm dịch là: Đừng quên tên anh)

  • Biết cách tạo, khởi chạy và tạm dừng một Activity trong Android.
  • Bạn sẽ biết cách kết nối và truyền dữ liệu giữa các Activity với nhau
  • Hiểu rõ bản chất vòng đời của Activity, từ đó dễ dàng xử lý trải nghiệm tương ứng với các trạng thái của Activity.

activity trong android

Làm việc với Activity trong Android

Để bắt đầu tìm hiểu, bạn hãy download ứng dụng mẫu mà mình đã tạo sẵn. Như mọi khi, đây chỉ là bộ khung của ứng dụng. Trong quá trình đọc bài viết, bạn sẽ code thêm vào để hoàn thành ứng dụng.

Lưu ý: Sử dụng Android Studio 3.0 trở lên. Cách import dự án như sau: chọn menu Open an existing Android Studio project. Sau đó tìm đến thư mục dự án mà bạn vừa giải nén.

Màn hình Welcome của Android Studio

Mình nói qua về ứng dụng Forget Me Not:
Ứng dụng cũng đơn giản thôi, chức năng chỉ có tạo và xóa các task công việc trong ngày của bạn. Mỗi task sẽ có ngày giờ để có thể tiện theo dõi. Rất cơ bản đúng không!

Activity là gì? Vòng đời của Activity

Trước khi bạn múa tay trên bàn phím để code, chúng ta cùng nhau tìm hiểu lý thuyết nhé

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ý logi 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

Activity trong Android

Các trạng thái vòng đời của một activity trong android

Mình sẽ giải thích chi tiết từng trạng thái của Activity để các bạn hiểu bản chất:

  • onCreate(): Được gọi bởi OS khi activity được tạo(chỉ gọi duy nhất một lần). Tại đây, bạn có thể khởi tạo giao diện hoặc dữ liệu để dùng cho sau này. Ngoài ra, bạn để ý tham số savedInstanceState. Tham số này chính là trạng thái trước đó của Activity. Mục đích của nó là để bạn có thể khôi phục lại trạng thái của Activity
  • onStart(): Ngay trước khi activity được chạy và tương tác với người dùng thì hàm được gọi. Thông thường, tại hàm này chúng ta sẽ khởi tạo animation cho UI( nếu có), Audio, hay bất kì đối tượng nào cần thiết để activity có thể hiển thị cho người dùng
  • onResume(): Hàm này được gọi khi activity chuẩn bị chạy hoặc activity được kích hoạt trở lại từ trạng thái stop(Ví dụ: người dùng ấn phím HOME hoặc có cuộc gọi đến…). Tại hàm này, thường chúng ta sẽ khởi động lại animation, cập nhật UI, hay khởi động lại camera, Audio/Video playback… Nói chung là khỏi động lại tất cả những mà bạn đã release ở hàm onPause()
  • onPause(): Hàm này được gọi khi ứng dụng chuyển sang chạy nền( Tức là ứng dụng không hiển thị trên màn hình). Ngược với onResume(), tại hàm này chúng ta nên stop Animation, Audio/video playback, tạm dừng camera… Lý do đơn giản vì lúc này ứng dụng không hiển thị và tương tác với người dùng nữa.
  • onStop(): Hàm này được ngay sau onPause(), khi activity không còn tương tác với người dùng. Tại đây, tốt nhất là bạn nên tiến hành sao lưu dữ liệu để có thể khôi phục lại khi activity được kích hoạt lại.
  • onRestart(): Được gọi sau khi activity bị tạm dừng và giờ được kích hoạt trở lại
  • onDestroy(): Đây là hàm cuối cùng trong vòng đời của activity. Có 2 cách để hàm được gọi: một là bạn gọi hàm finish() để chủ động tắt một activity, hai là được gọi tự động bởi OS khi tài nguyên cạn kiệt. Tại hàm này, bạn nên giải phóng toàn bộ những task nào đang chạy nền, hoặc những đối tượng(object) toàn cục để tránh bị lỗi Memory Leak.

Quá nhiều hàm phải nhớ đúng không?! Đừng sợ, chúng ta sẽ thực hành và rồi mưa dầm thấm lâu.

Chắc hẳn nhiều bạn sẽ ngạc nhiên khi vòng đời Activity gần giống với vòng đời Fragment. Lý do là Fragment được “gắn” trên Activity nên mới có sự tương đồng như vậy.

Minh họa vòng đời Activity bằng code

Mình nhắc lại là vòng đời activity là kiến thức cực kì quan trọng. Bạn nên đọc kỹ và ghi nhớ nó như việc đánh răng buổi sáng vậy.

Để đỡ nhàm chán, chúng ta sẽ bắt đầu với một ví dụ nhé

Bạn vẫn đang mở Android Studio đó chứ. Bạn mở MainActivity.kt và thấy hàm onCreate()được override như sau

class MainActivity : AppCompatActivity() {
  // 1
  private val taskList: MutableList<String> = mutableListOf()
  private val adapter by lazy { makeAdapter(taskList) }

  override fun onCreate(savedInstanceState: Bundle?) {
    // 2
    super.onCreate(savedInstanceState)
    // 3
    setContentView(R.layout.activity_main)
    // 4
    taskListView.adapter = adapter
    // 5
    taskListView.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> }
  }
  // 6
  fun addTaskClicked(view: View) {
  }
  // 7
  private fun makeAdapter(list: List<String>): ArrayAdapter<String> =
      ArrayAdapter(this, android.R.layout.simple_list_item_1, list)
}

Bạn có thấy phức tạp không? Mình sẽ giải thích lần lượt từng bước:

  1. Bạn khởi tạo các biến mà bạn cần dùng cho Activity: taskList, adapter. Mục đích là để tạo adapter và biến lưu dữ liệu cho Adapter
  2. Tiếp theo là chúng ta thực hiện việc “chỉ định” layout cho activity thông qua hàm setContentView()
  3. Tiếp đến là thiết lập một adapter cho listview: taskListView. Đây là cách viết rút gọn khi bạn sử dụng Kotlin Android Extensions. Còn như cách thông thường là chúng ta sử dụng hàm findViewById()
  4. Bạn thêm callback lắng nghe sự kiện OnItemClickListener() cho ListView để sử lý khi người dùng click vào listview.
Note:
Nếu bạn muốn tìm hiểu kỹ hơn về ListView/RecyclerView thì mình đã có một bài viết rất chi tiết: Hướng dẫn toàn tập về RecyclerView trong Android

Có lẽ hôm nay chúng ta nghiên cứu đến đây là đủ. Vì không nên nhồi nhét quá nhiều thứ vào đầu cùng một lúc, đặc biệt là kiến thức quan trọng. Chúng cần phải được thấm dần dần. Bài viết sau chúng ta sẽ tiếp tục tìm hiểu cách start một Activity, làm sao có thể tạm dừng Activity và còn nhiều thứ hay ho khác. Các bạn nhớ lưu source code về máy tính vì nó sẽ được sử dụng ở bài sau.

Hẹn gặp lại và đừng quên comment ủng hộ mình nhé

Xem tiếp các bài trong Series
Phần trước: Debug trong Android Studio – Đây là kỹ năng cần phải giỏiPhần kế tiếp: Tìm hiểu Activity trong Android – Phần 2: Cách tạo và sử dụng Activity
Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trướcDebug trong Android Studio – Đây là kỹ năng cần phải giỏi
Bài tiếp theoTìm hiểu Activity trong Android – Phần 2: Cách tạo và sử dụng Activity
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

21
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Thien Pham
Guest
Thien Pham

Bài viết rất hữu ích cho người bắt đầu và những bạn chuẩn bị đi phỏng vấn :)))

DUONG
Guest
DUONG

cho minh hoi. su dung project for get me not no bao loi. khac phuc loi nay the nao vay ah.

Could not initialize class org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImplKt

Ha Thanh Long
Guest
Ha Thanh Long

Mình import project thì nó báo Gradle-4.1 download failed thì làm thế nào bạn?

Lão Nông
Guest
Lão Nông

Bạn viết thật hay. Chúc bạn mạnh khoẻ. Tks

Thịnh
Guest
Thịnh

ad ơi cho em xin link download Started project Forgot Me Not vì link trên yêu cầu đăng ký tài khoản vs credit card 🙁

anh
Guest
anh

ad ơi nó nói như này thì làm như nào
The specified Android SDK Build Tools version (26.0.0) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle Plugin 3.5.2.

anh
Guest
anh

Migrate Project to Gradle?
This project does not use the Gradle build system. We recommend that you migrate to using the Gradle build system.
More Information about migrating to Gradle
Don’t show this message again.
ad ơi nó nói như này là như nào ad. ad chỉ với

Phong
Guest
Phong

Chào Anh,
Khi em Open Project xong thì nó báo lỗi
ERROR: The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.0 and higher.
The following dependencies do not satisfy the required version:
root project ‘ForgetMeNot-starter’ -> org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.3
Affected Modules: app
Lỗi này khắc phục sao anh?
Thanks