Cách sử dụng Vòng đời và trạng thái hoạt động

1. Chào mừng bạn

Lớp học lập trình thực hành này nằm trong Bài 1: Bắt đầu trong khoá học Kiến thức cơ bản dành cho nhà phát triển Android (Phiên bản 2). Bạn sẽ khai thác tối đa giá trị của khoá học này nếu thực hiện theo trình tự các lớp học lập trình:

  • Để biết danh sách đầy đủ các lớp học lập trình trong khoá học này, hãy xem Lớp học lập trình cho khoá học Kiến thức cơ bản dành cho nhà phát triển Android (Phiên bản 2).
  • Để biết thông tin chi tiết về khoá học này, bao gồm cả đường liên kết đến tất cả chương khái niệm, ứng dụng và trang trình bày, hãy tham khảo Kiến thức cơ bản dành cho nhà phát triển Android (Phiên bản 2).

Giới thiệu

Trong lớp học lập trình này, bạn sẽ tìm hiểu thêm về vòng đời hoạt động. Vòng đời là tập hợp trạng thái của một hoạt động trong suốt thời gian hoạt động, từ khi hoạt động được tạo đến khi bị huỷ và hệ thống lấy lại tài nguyên. Khi người dùng di chuyển giữa các hoạt động trong ứng dụng (cũng như vào và ra khỏi ứng dụng), các hoạt động sẽ chuyển đổi giữa nhiều trạng thái trong vòng đời của chúng.

Vấn đề iDouble

Mỗi giai đoạn trong vòng đời của một hoạt động có một phương thức gọi lại tương ứng: onCreate(), onStart(), onPause(), v.v. Khi một hoạt động thay đổi trạng thái, phương thức gọi lại được liên kết sẽ được gọi. Bạn đã thấy một trong các phương thức sau: onCreate(). Bằng cách ghi đè bất kỳ phương thức gọi lại nào trong vòng đời trong các lớp Hoạt động, bạn có thể thay đổi hành vi mặc định của hoạt động để phản hồi thao tác của người dùng hoặc hệ thống.

Trạng thái hoạt động cũng có thể thay đổi theo các thay đổi về cấu hình thiết bị, chẳng hạn như khi người dùng xoay thiết bị từ dọc sang ngang. Khi những thay đổi về cấu hình như vậy diễn ra, hoạt động sẽ bị huỷ và được tạo lại ở trạng thái mặc định. Đồng thời, người dùng có thể mất thông tin đã nhập vào hoạt động. Để tránh gây nhầm lẫn cho người dùng, quan trọng là bạn phải phát triển ứng dụng để ngăn chặn tình trạng mất dữ liệu ngoài mong muốn. Trong phần cuối của lớp học lập trình này, bạn sẽ thử nghiệm các thay đổi về cấu hình và tìm hiểu cách duy trì trạng thái của hoạt động để phản hồi các thay đổi về cấu hình thiết bị cũng như các sự kiện khác trong vòng đời hoạt động.

Trong lớp học lập trình này, bạn sẽ thêm các câu lệnh ghi nhật ký vào ứng dụng TwoActivities rồi quan sát các thay đổi trong vòng đời hoạt động khi bạn sử dụng ứng dụng. Sau đó, bạn bắt đầu làm việc với những thay đổi này và tìm hiểu cách xử lý hoạt động đầu vào của người dùng trong các điều kiện này.

Điều kiện tiên quyết

Bạn phải làm được những việc sau:

  • Tạo và chạy dự án ứng dụng trong Android Studio.
  • Thêm câu lệnh nhật ký vào ứng dụng và xem các nhật ký đó trong ngăn Logcat.
  • Hiểu và xử lý Hoạt động và Ý định cũng như thoải mái tương tác với những hoạt động này.

Kiến thức bạn sẽ học được

  • Cách hoạt động của Vòng đời hoạt động.
  • Khi một Hoạt động bắt đầu, tạm dừng, dừng và bị huỷ bỏ.
  • Giới thiệu về phương thức gọi lại trong vòng đời liên kết với các thay đổi về Hoạt động.
  • Ảnh hưởng của những thao tác (chẳng hạn như thay đổi về cấu hình) có thể dẫn đến các sự kiện trong Vòng đời hoạt động.
  • Cách giữ lại trạng thái Hoạt động trong các sự kiện vòng đời.

Bạn sẽ thực hiện

  • Thêm đoạn mã vào ứng dụng TwoActivities trong lớp học lập trình trước đó để triển khai nhiều phương thức gọi lại trong Vòng đời hoạt động (Activity) nhằm đưa cả các câu lệnh ghi nhật ký vào.
  • Quan sát trạng thái thay đổi khi ứng dụng chạy và khi bạn tương tác với từng Hoạt động trong ứng dụng.
  • Sửa đổi ứng dụng để giữ lại trạng thái thực thể của một Hoạt động được tạo lại đột ngột nhằm phản hồi hành vi của người dùng hoặc thay đổi cấu hình trên thiết bị.

2. Tổng quan về ứng dụng

Trong lớp học lập trình này, bạn sẽ tiếp tục thực hành trên ứng dụng TwoActivities. Ứng dụng này có giao diện và hoạt động gần giống như trong lớp học lập trình trước. Ứng dụng này có hai cách triển khai Hoạt động và cho phép người dùng gửi giữa các cách triển khai. Các thay đổi bạn thực hiện đối với ứng dụng trong lớp học lập trình này sẽ không ảnh hưởng đến hành vi có thể quan sát được của người dùng.

3. 3. Nhiệm vụ 1: Thêm phương thức gọi lại trong vòng đời vào TwoActivities

Trong nhiệm vụ này, bạn sẽ triển khai tất cả phương thức gọi lại trong Vòng đời hoạt động để in thông điệp lên logcat khi các phương thức đó được gọi. Các thông điệp nhật ký này sẽ cho bạn biết khi nào Vòng đời hoạt động thay đổi trạng thái và ảnh hưởng của những thay đổi đó đối với ứng dụng của bạn khi ứng dụng chạy.

1.1 (Không bắt buộc) Sao chép dự án TwoActivities

Đối với các nhiệm vụ trong lớp học lập trình này, bạn sẽ sửa đổi dự án TwoActivities hiện có mà bạn đã xây dựng trong lớp học lập trình gần đây nhất. Nếu bạn muốn giữ nguyên dự án TwoActivities trước, hãy làm theo các bước trong Phụ lục: Tiện ích để tạo bản sao của dự án.

1.2 Triển khai phương thức gọi lại cho MainActivity

  1. Mở dự án TwoActivities trong Android Studio rồi mở MainActivity trong ngăn Project (Dự án) > Android.
  2. Trong phương thức onCreate(), hãy thêm các câu lệnh nhật ký sau:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Thêm một cơ chế ghi đè cho lệnh gọi lại onStart(), kèm theo một câu lệnh cho nhật ký của sự kiện đó:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Để sử dụng phím tắt, hãy chọn Mã > Phương thức ghi đè trong Android Studio. Một hộp thoại sẽ xuất hiện cùng tất cả phương thức mà bạn có thể dùng để ghi đè trong lớp dữ liệu. Thao tác chọn một hoặc nhiều phương thức gọi lại trong danh sách sẽ chèn một mẫu hoàn chỉnh cho các phương thức đó, bao gồm cả phương thức gọi bắt buộc đến lớp cấp cao (superclass).

  1. Sử dụng phương thức onStart() làm mẫu để triển khai các phương thức gọi lại trong vòng đời onPause(), onRestart(), onResume(), onStop() và onDestroy()

Tất cả phương thức gọi lại đều có cùng chữ ký (ngoại trừ tên). Nếu bạn Sao chép và Dán onStart() để tạo các phương thức gọi lại khác, đừng quên cập nhật nội dung để gọi phương thức phù hợp trong lớp cấp cao và để ghi nhật ký đúng phương thức.

  1. Chạy ứng dụng của bạn.
  2. Nhấp vào thẻ Logcat ở cuối Android Studio để hiện ngăn Logcat. Bạn sẽ thấy 3 thông điệp nhật ký cho thấy 3 trạng thái vòng đời mà Hoạt động đã chuyển đổi khi bắt đầu:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 Triển khai phương thức gọi lại trong vòng đời trong SecondActivity

Lúc này, bạn đã triển khai các phương thức gọi lại trong vòng đời cho MainActivity, hãy thực hiện tương tự cho SecondActivity.

  1. Mở SecondActivity.
  2. Ở trên cùng của lớp, hãy thêm một hằng số cho biến LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Thêm các phương thức gọi lại trong vòng đời và câu lệnh nhật ký vào Hoạt động thứ hai. (Bạn có thể Sao chép và Dán các phương thức gọi lại từ MainActivity.)
  2. Thêm câu lệnh nhật ký vào phương thức returnAnswer() ngay trước phương thức finish():
Log.d(LOG_TAG, "End SecondActivity");

1.4 Quan sát nhật ký khi ứng dụng chạy**

  1. Chạy ứng dụng của bạn.
  2. Nhấp vào thẻ Logcat ở cuối Android Studio để hiện ngăn Logcat.
  3. Nhập Hoạt động vào hộp tìm kiếm. Logcat Android có thể rất dài và lộn xộn. Vì biến LOG_TAG trong mỗi lớp chứa từ MainActivity hoặc SecondActivity, nên từ khóa này chỉ cho phép bạn lọc nhật ký theo những chủ đề bạn quan tâm.

Vấn đề iDouble

Thử nghiệm sử dụng ứng dụng của bạn và lưu ý rằng các sự kiện trong vòng đời xảy ra để phản hồi nhiều thao tác. Cụ thể, hãy thử những thao tác sau:

  • Sử dụng ứng dụng như bình thường (gửi tin nhắn, trả lời bằng tin nhắn khác).
  • Sử dụng nút Quay lại để quay lại từ Hoạt động thứ hai về Hoạt động chính.
  • Sử dụng Mũi tên lên trong thanh ứng dụng để quay lại từ Hoạt động thứ hai về Hoạt động chính.
  • Xoay thiết bị trên cả Hoạt động chính và Hoạt động thứ hai vào các thời điểm khác nhau trong ứng dụng của bạn và quan sát những gì xảy ra trong * nhật ký và trên màn hình.
  • Nhấn vào nút tổng quan (nút hình vuông ở bên phải Màn hình chính) rồi đóng ứng dụng (nhấn vào X).
  • Quay lại màn hình chính rồi khởi động lại ứng dụng.

MẸO: Nếu đang chạy ứng dụng trong trình mô phỏng, bạn có thể mô phỏng thao tác xoay bằng tổ hợp phím Control+F11 hoặc Control+Function+F11.

Đoạn mã giải pháp cho nhiệm vụ 1

Các đoạn mã sau đây là giải pháp cho nhiệm vụ đầu tiên.

MainActivity

Các đoạn mã sau đây là mã đã thêm trong MainActivity chứ không phải toàn bộ lớp.

Phương thức onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Log the start of the onCreate() method.
        Log.d(LOG_TAG, "-------");
        Log.d(LOG_TAG, "onCreate");

        // Initialize all the view variables.
        mMessageEditText = findViewById(R.id.editText_main);
        mReplyHeadTextView = findViewById(R.id.text_header_reply);
        mReplyTextView = findViewById(R.id.text_message_reply);
}

Các phương thức khác trong vòng đời:

@Override
protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "onStart");
}

@Override
protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "onPause");
}

@Override
protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "onRestart");
}

@Override
protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "onResume");
}

@Override
protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "onStop");
}

@Override
protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
}

SecondActivity

Các đoạn mã sau đây là mã đã thêm trong SecondActivity, chứ không phải toàn bộ lớp.

Ở đầu lớp SecondActivity:

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

Phương thức returnAnswer():

public void returnReply(View view) {
        String reply = mReply.getText().toString();
        Intent replyIntent = new Intent();
        replyIntent.putExtra(EXTRA_REPLY, reply);
        setResult(RESULT_OK, replyIntent);
        Log.d(LOG_TAG, "End SecondActivity");
        finish();
}

Các phương thức khác trong vòng đời:

Tương tự như trên đối với MainActivity.

4. 4. Nhiệm vụ 2: Lưu và khôi phục trạng thái của thực thể Activity

Tuỳ thuộc vào tài nguyên hệ thống và hành vi của người dùng, từng Hoạt động trong ứng dụng có thể bị huỷ bỏ và tạo lại thường xuyên hơn nhiều so với bạn nghĩ.

Có thể bạn đã nhận thấy hành vi này trong phần cuối khi xoay thiết bị hoặc trình mô phỏng. Xoay thiết bị là một ví dụ về thay đổi cấu hình thiết bị. Mặc dù chế độ xoay là biến phổ biến nhất, nhưng tất cả thay đổi về cấu hình dẫn đến việc Hoạt động hiện tại đều bị huỷ và tạo lại như mới. Nếu bạn không tính đến hành vi này trong mã, thì khi cấu hình thay đổi, bố cục Hoạt động có thể quay về giao diện mặc định và các giá trị ban đầu. Đồng thời, người dùng có thể mất vị trí, dữ liệu hoặc trạng thái tiến trình của họ trong ứng dụng.

Trạng thái của mỗi Hoạt động được lưu trữ dưới dạng một tập hợp cặp giá trị/khoá trong đối tượng Gói được gọi là trạng thái thực thể của Hoạt động. Hệ thống sẽ lưu thông tin trạng thái mặc định vào Gói trạng thái thực thể ngay trước khi Hoạt động dừng rồi chuyển Gói đó đến thực thể mới của Hoạt động để khôi phục.

Để tránh mất dữ liệu khi Hoạt động đột ngột bị huỷ và tạo lại, bạn cần triển khai phương thức onSaveInstanceState(). Hệ thống sẽ gọi phương thức này trên Hoạt động của bạn (giữa onPause() và onStop()) khi có khả năng Hoạt động có thể bị huỷ và tạo lại.

Dữ liệu bạn lưu ở trạng thái thực thể chỉ dành riêng cho thực thể này của Hoạt động này trong phiên hoạt động hiện tại của ứng dụng. Khi bạn dừng và khởi động lại một phiên ứng dụng mới, trạng thái thực thể của Hoạt động sẽ bị mất và Hoạt động chuyển về giao diện mặc định. Nếu bạn cần lưu dữ liệu người dùng giữa các phiên ứng dụng, hãy sử dụng lựa chọn ưu tiên được chia sẻ hoặc một cơ sở dữ liệu. Bạn sẽ tìm hiểu về cả hai phương pháp này trong một lớp học lập trình sau này.

2.1 Lưu trạng thái của thực thể Activity bằng onSaveInstanceState()

Bạn có thể nhận thấy thao tác xoay thiết bị hoàn toàn không ảnh hưởng đến trạng thái của Hoạt động thứ hai. Lý do là bố cục và trạng thái Hoạt động thứ hai được tạo từ bố cục và Ý định đã kích hoạt bố cục đó. Ngay cả khi Hoạt động được tạo lại, Ý định vẫn ở đó và dữ liệu trong Ý định đó vẫn được dùng mỗi khi phương thức onCreate() trong Hoạt động thứ hai được gọi.

Ngoài ra, bạn có thể nhận thấy trong mỗi Hoạt động, mọi văn bản bạn nhập vào các thành phần EditText của tin nhắn hoặc câu trả lời đều được giữ lại ngay cả khi xoay thiết bị. Điều này là do thông tin trạng thái của một số phần tử Chế độ xem trong bố cục của bạn được lưu tự động qua các thay đổi về cấu hình và giá trị hiện tại của EditText là một trong những trường hợp đó.

Vì vậy, trạng thái Hoạt động duy nhất mà bạn quan tâm là các phần tử TextView cho tiêu đề trả lời và văn bản trả lời trong Hoạt động chính. Theo mặc định, cả hai phần tử TextView đều không xuất hiện; chúng chỉ xuất hiện khi bạn gửi tin nhắn lại cho Hoạt động chính qua Hoạt động thứ hai.

Trong nhiệm vụ này, bạn thêm đoạn mã để duy trì trạng thái thực thể của hai phần tử TextView này bằng cách sử dụng onSaveInstanceState().

  1. Mở MainActivity.
  2. Thêm phương thức triển khai skeleton này của onSaveInstanceState() vào Activity (Hoạt động) hoặc sử dụng Code > Override Methods (Phương thức ghi đè) để chèn phần ghi đè skeleton.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Kiểm tra xem tiêu đề hiện tại có xuất hiện hay không. Nếu có, hãy đặt trạng thái hiển thị đó vào Gói trạng thái bằng phương thứcputBoolean() và khoá "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Hãy nhớ rằng tiêu đề và văn bản trả lời được đánh dấu là không xuất hiện cho đến khi có câu trả lời của Hoạt động thứ hai. Nếu tiêu đề xuất hiện thì tức là có dữ liệu trả lời cần được lưu. Xin lưu ý rằng chúng ta chỉ quan tâm đến trạng thái hiển thị đó. Văn bản thực tế của tiêu đề không cần được lưu vì văn bản đó không bao giờ thay đổi.

  1. Cũng trong quy trình kiểm tra đó, hãy thêm văn bản trả lời vào Gói.
outState.putString("reply_text",mReplyTextView.getText().toString());

Nếu tiêu đề xuất hiện thì bạn có thể giả định rằng chính tin nhắn trả lời cũng xuất hiện. Bạn không cần kiểm tra hoặc lưu trạng thái hiển thị hiện tại của tin nhắn trả lời. Chỉ văn bản thực tế của tin nhắn mới được đưa vào Gói trạng thái với khoá "reply_text".

Bạn chỉ lưu trạng thái của các thành phần Khung hiển thị có thể thay đổi sau khi tạo Hoạt động. Bạn có thể tạo lại các thành phần Thành phần hiển thị khác trong ứng dụng (EditText, Nút) qua bố cục mặc định vào bất cứ lúc nào.

Lưu ý rằng hệ thống sẽ lưu trạng thái của một số phần tử Khung hiển thị, chẳng hạn như nội dung của EditText.

2.2 Khôi phục trạng thái của thực thể Activity trong onCreate()

Sau khi lưu trạng thái của thực thể Activity, bạn cũng cần khôi phục trạng thái này khi Hoạt động được tạo lại. Bạn có thể thực hiện việc này trong onCreate() hoặc bằng cách triển khai lệnh gọi lại onRestoreInstanceState(), được gọi sau onStart() sau khi tạo Hoạt động.

Trong mọi trường hợp, nơi tốt nhất để khôi phục trạng thái Hoạt động là trong onCreate(), nhằm đảm bảo rằng giao diện người dùng, bao gồm cả trạng thái, xuất hiện sớm nhất có thể. Đôi khi, bạn có thể thực hiện việc này trong onRestoreInstanceState() sau khi mọi thao tác khởi chạy đã hoàn tất, hoặc cho phép các lớp con quyết định xem có sử dụng cách triển khai mặc định của bạn hay không.

  1. Trong phương thức onCreate(), sau khi các biến View được khởi chạy bằng findViewById(), hãy thêm một quy trình kiểm thử để đảm bảo savedInstanceState không rỗng.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);

// Restore the state.
if (savedInstanceState != null) {
}

Khi Hoạt động của bạn được tạo, hệ thống sẽ chuyển Gói trạng thái sang onCreate() làm đối số duy nhất. Lần đầu tiên gọi onCreate() và ứng dụng khởi động, Gói này rỗng – không có trạng thái hiện tại trong lần đầu ứng dụng khởi động. Các lệnh gọi tiếp theo đối với onCreate() có một gói được điền sẵn dữ liệu mà bạn đã lưu trữ trong onSaveInstanceState().

  1. Trong quy trình kiểm tra đó, hãy lấy chế độ hiển thị hiện tại (giá trị true hoặc false) ra khỏi Gói bằng khoá "reply_visible".
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Thêm quy trình kiểm tra bên dưới dòng trước đó cho biến isVisible.
if (isVisible) {
}

Nếu có khoá response_visible trong Gói trạng thái (và do đó isVisible là true), thì bạn sẽ cần khôi phục trạng thái.

  1. Trong quy trình kiểm tra isVisible, hãy cho thấy tiêu đề.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Nhận tin nhắn trả lời bằng văn bản trong Gói có khoá "reply_text" rồi đặt TextView trả lời để cho thấy chuỗi đó.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Cũng thực hiện tương tự để TextView trả lời xuất hiện:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Chạy ứng dụng. Hãy thử xoay thiết bị hoặc trình mô phỏng để đảm bảo tin nhắn trả lời (nếu có) vẫn xuất hiện trên màn hình sau khi Hoạt động được tạo lại.

Đoạn mã giải pháp cho nhiệm vụ 2

Các đoạn mã sau đây là giải pháp cho nhiệm vụ này.

MainActivity

Các đoạn mã sau đây là mã đã thêm trong MainActivity chứ không phải toàn bộ lớp.

Phương thức onSaveInstanceState():

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   // If the heading is visible, message needs to be saved.
   // Otherwise we're still using default layout.
   if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
       outState.putBoolean("reply_visible", true);
       outState.putString("reply_text", 
                      mReplyTextView.getText().toString());
   }
}

Phương thức onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   Log.d(LOG_TAG, "-------");
   Log.d(LOG_TAG, "onCreate");

   // Initialize all the view variables.
   mMessageEditText = findViewById(R.id.editText_main);
   mReplyHeadTextView = findViewById(R.id.text_header_reply);
   mReplyTextView = findViewById(R.id.text_message_reply);

   // Restore the saved state. 
   // See onSaveInstanceState() for what gets saved.
   if (savedInstanceState != null) {
       boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
       // Show both the header and the message views. If isVisible is
       // false or missing from the bundle, use the default layout.
       if (isVisible) {
           mReplyHeadTextView.setVisibility(View.VISIBLE);
           mReplyTextView.setText(savedInstanceState
                                  .getString("reply_text"));
           mReplyTextView.setVisibility(View.VISIBLE);
       }
   }
}

Dự án hoàn chỉnh:

Dự án Android Studio: TwoActivitiesLifecycle

5. Lập trình

Thử thách: Tạo một ứng dụng danh sách mua sắm đơn giản có hoạt động chính cho danh sách người dùng đang xây dựng và hoạt động thứ hai cho danh sách mặt hàng mua sắm phổ biến.

  • Hoạt động chính phải chứa danh sách cần xây dựng và nên được tạo bằng 10 phần tử TextView trống.
  • Nút Add Item (Thêm mặt hàng) trên hoạt động chính sẽ khởi chạy hoạt động thứ hai, trong đó chứa danh sách mặt hàng mua sắm phổ biến (Phô mai, Gạo, Táo, v.v.). Sử dụng phần tử Nút để cho thấy các mặt hàng.
  • Thao tác chọn một mặt hàng sẽ đưa người dùng trở lại hoạt động chính rồi cập nhật một TextView trống để thêm mặt hàng đã chọn.

Sử dụng Intent (Ý định) để truyền thông tin từ Hoạt động này sang Hoạt động khác. Đừng quên lưu trạng thái hiện tại của danh sách mua sắm khi người dùng xoay thiết bị.

6. Tóm tắt

  • Vòng đời hoạt động là tập hợp trạng thái mà một Hoạt động di chuyển qua, bắt đầu từ khi được tạo lần đầu và kết thúc khi hệ thống Android xác nhận lại tài nguyên cho Hoạt động đó.
  • Khi người dùng chuyển từ Hoạt động này sang Hoạt động khác, bên trong và bên ngoài ứng dụng của bạn, mỗi Hoạt động sẽ di chuyển giữa các trạng thái trong Vòng đời hoạt động.
  • Mỗi trạng thái trong Vòng đời hoạt động đều có một phương thức gọi lại tương ứng mà bạn có thể ghi đè trong lớp Hoạt động.
  • Có các phương thức vòng đời là onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
  • Thao tác ghi đè phương thức gọi lại trong vòng đời cho phép bạn thêm hành vi xảy ra khi Hoạt động chuyển đổi sang trạng thái đó.
  • Bạn có thể thêm các phương thức ghi đè khung vào các lớp của mình trong Android Studio bằng cách chọn Mã > Ghi đè.
  • Các thay đổi về cấu hình thiết bị (chẳng hạn như xoay) dẫn đến việc Hoạt động bị huỷ và tạo lại như mới.
  • Một phần của trạng thái Hoạt động được giữ nguyên khi thay đổi cấu hình, bao gồm cả các giá trị hiện tại của phần tử EditText. Đối với mọi dữ liệu khác, bạn phải tự lưu dữ liệu đó một cách rõ ràng.
  • Lưu trạng thái của thực thể Activity trong phương thức onSaveInstanceState().
  • Dữ liệu trạng thái thực thể được lưu trữ dưới dạng các cặp giá trị/khoá đơn giản trong một Gói. Sử dụng các phương thức Gói để đưa dữ liệu vào và lấy lại dữ liệu qua Gói.
  • Khôi phục trạng thái của thực thể trong onCreate() (cách ưu tiên) hoặc onRestoreInstanceState(). Quay lại