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

Chúng ta sẽ liên tục khám phá Activity, một thành phần đặc biệt quan trọng quan trọng của ứng dụng Android. Activity trong Android là nơi diễn ra mọi hoạt động giải trí tương tác với người dùng, do tại toàn bộ những màn hình hiển thị ứ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, tất cả chúng ta cùng nhau tìm hiểu và khám phá kim chỉ nan 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 giải trí độc lập với nhau nhưng hoàn toàn có thể tương tác và truyển dữ liệu qua nhau trải qua Intent. Chính vì Activity hoạt động giải trí độ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ẽ vướng mắc : với ứng dụng nhiều màn hình hiển thị mà được phong cách thiết kế tương ứng với nhiều Activity thì thiết kế 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 để giải quyết và xử lý vòng đời Activity sao ?
Đừng quá lo ngại ! Android sẽ giải quyết và xử lý yếu tố đó cho bạn. Trong Android, người ta đã định nghĩa sẵn những 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 giải quyết và 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ẽ lý giải chi tiết cụ thể từng trạng thái của Activity để những bạn hiểu thực 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ợ, tất cả chúng ta sẽ thực hành thực tế 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.

  • Dành cho bạn: Hướng dẫn toàn tập về cách sử dụng Fragment trong Android

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 và kỹ năng 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, tất cả chúng ta sẽ mở màn 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 = 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): ArrayAdapter =
      ArrayAdapter(this, android.R.layout.simple_list_item_1, list)
}

Bạn có thấy phức tạp không ? Mình sẽ lý giải 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

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:

Có lẽ thời điểm ngày hôm nay tất cả chúng ta nghiên cứu và điều tra đế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 quan trọng là kỹ năng và kiến thức quan trọng. Chúng cần phải được thấm từ từ. Bài viết sau tất cả chúng ta sẽ liên tục khám phá cách start một Activity, làm thế nào hoàn toàn 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é