Các thay đổi về trạng thái hoạt động

Các sự kiện khác nhau, một số do người dùng kích hoạt và một số do hệ thống kích hoạt, có thể khiến Activity chuyển đổi từ trạng thái này sang trạng thái khác. Tài liệu này mô tả một số trường hợp chuyển đổi phổ biến và cách xử lý các quá trình chuyển đổi đó.

Để biết thêm thông tin về trạng thái hoạt động, hãy xem phần Vòng đời hoạt động. Để tìm hiểu về cách lớp ViewModel có thể giúp bạn quản lý vòng đời hoạt động, hãy xem phần tổng quan về ViewModel.

Xảy ra thay đổi về cấu hình

Có một số sự kiện có thể kích hoạt thay đổi về cấu hình. Có thể ví dụ nổi bật nhất là sự thay đổi giữa hướng dọc và ngang. Các trường hợp khác có thể gây ra thay đổi về cấu hình bao gồm các thay đổi về chế độ cài đặt ngôn ngữ hoặc thiết bị đầu vào.

Khi diễn ra thay đổi về cấu hình, hoạt động sẽ bị huỷ bỏ và tạo lại. Thao tác này sẽ kích hoạt các lệnh gọi lại sau đây trong thực thể hoạt động ban đầu:

  1. onPause()
  2. onStop()
  3. onDestroy()

Một thực thể mới của hoạt động sẽ được tạo và các lệnh gọi lại sau đây được kích hoạt:

  1. onCreate()
  2. onStart()
  3. onResume()

Sử dụng kết hợp các thực thể ViewModel, phương thức onSaveInstanceState() hoặc bộ nhớ cục bộ ổn định để duy trì trạng thái giao diện người dùng của một hoạt động khi cấu hình thay đổi. Việc quyết định cách kết hợp các tuỳ chọn này phụ thuộc vào độ phức tạp của dữ liệu giao diện người dùng, các trường hợp sử dụng của ứng dụng và việc xem xét tốc độ truy xuất so với mức sử dụng bộ nhớ. Để biết thêm thông tin về cách lưu trạng thái giao diện người dùng hoạt động của bạn, hãy xem bài viết Lưu trạng thái giao diện người dùng.

Xử lý các trường hợp có nhiều cửa sổ

Khi một ứng dụng chuyển sang chế độ nhiều cửa sổ có trong Android 7.0 (API cấp 24) trở lên, hệ thống sẽ thông báo cho hoạt động đang chạy về một thay đổi về cấu hình, do đó sẽ trải qua các quá trình chuyển đổi vòng đời được mô tả trước đó.

Hành vi này cũng xảy ra nếu một ứng dụng đã ở chế độ nhiều cửa sổ được đổi kích thước. Hoạt động của bạn có thể tự xử lý thay đổi về cấu hình hoặc có thể cho phép hệ thống huỷ bỏ hoạt động và tạo lại hoạt động đó bằng kích thước mới.

Để biết thêm thông tin về vòng đời nhiều cửa sổ, hãy xem nội dung giải thích về vòng đời nhiều cửa sổ trên trang Hỗ trợ nhiều cửa sổ.

Ở chế độ nhiều cửa sổ, mặc dù người dùng có thể nhìn thấy 2 ứng dụng, nhưng chỉ có ứng dụng mà người dùng đang tương tác là ở nền trước và được lấy tiêu điểm. Hoạt động đó ở trạng thái Tiếp tục, trong khi ứng dụng trong cửa sổ khác ở trạng thái Đã tạm dừng.

Khi người dùng chuyển từ ứng dụng A sang ứng dụng B, hệ thống sẽ gọi onPause() trên ứng dụng A và onResume() trên ứng dụng B. Nó chuyển đổi giữa 2 phương thức này mỗi khi người dùng chuyển đổi giữa các ứng dụng.

Để biết thêm thông tin chi tiết về chế độ nhiều cửa sổ, hãy tham khảo bài viết Hỗ trợ nhiều cửa sổ.

Hoạt động hoặc hộp thoại xuất hiện ở nền trước

Nếu một hoạt động hoặc hộp thoại mới xuất hiện ở nền trước, lấy tiêu điểm và che khuất một phần hoạt động đang diễn ra, thì hoạt động được đề cập sẽ mất tiêu điểm và chuyển sang trạng thái Paused (Đã tạm dừng). Sau đó, hệ thống sẽ gọi onPause() trên đó.

Khi hoạt động được đề cập quay lại nền trước và lấy lại tiêu điểm, hệ thống sẽ gọi onResume().

Nếu một hoạt động hoặc hộp thoại mới xuất hiện ở nền trước, lấy tiêu điểm và hoàn toàn bao phủ hoạt động đang diễn ra, thì hoạt động được đề cập sẽ mất tiêu điểm và chuyển sang trạng thái Đã dừng. Sau đó, hệ thống sẽ nhanh chóng gọi onPause()onStop().

Khi cùng một thực thể của hoạt động được đề cập quay lại nền trước, hệ thống sẽ gọi onRestart(), onStart()onResume() trên hoạt động đó. Nếu đây là một thực thể mới của hoạt động được đề cập xuất hiện ở chế độ nền, thì hệ thống sẽ không gọi onRestart() mà chỉ gọi onStart()onResume().

Người dùng nhấn hoặc cử chỉ Quay lại

Nếu một hoạt động chạy ở nền trước và người dùng nhấn hoặc cử chỉ Quay lại, thì hoạt động đó sẽ chuyển đổi thông qua các lệnh gọi lại onPause(), onStop()onDestroy(). Hoạt động bị huỷ bỏ và xoá khỏi ngăn xếp lui.

Theo mặc định, lệnh gọi lại onSaveInstanceState() không kích hoạt trong trường hợp này. Hành vi này giả định người dùng nhấn vào Back (Quay lại) mà không cần quay lại cùng một thực thể của hoạt động.

Tuy nhiên, bạn có thể ghi đè phương thức onBackPressed() để triển khai hành vi tuỳ chỉnh, chẳng hạn như hiển thị hộp thoại yêu cầu người dùng xác nhận rằng họ muốn thoát khỏi ứng dụng.

Nếu ghi đè phương thức onBackPressed(), bạn vẫn nên gọi super.onBackPressed() từ phương thức bị ghi đè. Nếu không, hành vi Quay lại của hệ thống có thể gây khó chịu cho người dùng.

Hệ thống tắt quy trình ứng dụng

Nếu một ứng dụng chạy ở chế độ nền và cần giải phóng bộ nhớ cho một ứng dụng trên nền trước, thì hệ thống có thể loại bỏ ứng dụng chạy ở chế độ nền đó. Khi tắt một ứng dụng, không có gì đảm bảo rằng onDestroy() sẽ được gọi trong ứng dụng đó.

Để tìm hiểu thêm về cách hệ thống quyết định quy trình nào cần huỷ bỏ, hãy đọc Trạng thái hoạt động và sự ra khỏi bộ nhớ cũng như Quy trình và vòng đời ứng dụng.

Để tìm hiểu cách lưu trạng thái giao diện người dùng hoạt động khi hệ thống dừng quy trình ứng dụng, hãy xem phần Lưu và khôi phục trạng thái tạm thời của giao diện người dùng.