Lô và gói

Bạn nên sử dụng các đối tượng ParcelableBundle trên các ranh giới của quy trình, chẳng hạn như với các giao dịch IPC/Binder, giữa các hoạt động với ý định và để lưu trữ trạng thái tạm thời qua các thay đổi về cấu hình. Trang này đưa ra các đề xuất và phương pháp hay nhất để sử dụng đối tượng ParcelableBundle.

Lưu ý: Parcel không phải là cơ chế chuyển đổi tuần tự đa năng và bạn không nên lưu trữ bất kỳ dữ liệu Parcel nào trên ổ đĩa hoặc gửi qua mạng.

Gửi dữ liệu giữa các hoạt động

Khi ứng dụng tạo một đối tượng Intent để dùng trong startActivity(android.content.Intent) trong quá trình bắt đầu một Hoạt động mới, ứng dụng có thể truyền các tham số bằng phương thức putExtra(java.lang.String, java.lang.String).

Đoạn mã sau đây cho thấy ví dụ về cách thực hiện thao tác này.

Kotlin

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

Java

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

Hệ điều hành sẽ phân tách Bundle cơ bản của ý định. Sau đó, hệ điều hành sẽ tạo hoạt động mới, huỷ phân vùng dữ liệu và chuyển ý định sang hoạt động mới.

Bạn nên dùng lớp Bundle để đặt các dữ liệu gốc mà hệ điều hành đã biết trên các đối tượng Intent. Lớp Bundle được tối ưu hoá cao cho việc sắp xếp và huỷ sắp xếp bằng cách sử dụng các lô đất.

Trong một số trường hợp, bạn có thể cần một cơ chế để gửi các đối tượng kết hợp hoặc phức tạp giữa các hoạt động. Trong những trường hợp như vậy, lớp tuỳ chỉnh sẽ triển khai Parcelable và cung cấp phương thức writeToParcel(android.os.Parcel, int) thích hợp. Ứng dụng này cũng phải cung cấp một trường không rỗng có tên là CREATOR. Trường này triển khai giao diện Parcelable.Creator (có phương thức createFromParcel() dùng để chuyển đổi Parcel trở lại đối tượng hiện tại). Để biết thêm thông tin, hãy xem tài liệu tham khảo về đối tượng Parcelable.

Khi gửi dữ liệu thông qua một ý định, bạn nên cẩn thận giới hạn kích thước dữ liệu ở mức vài KB. Việc gửi quá nhiều dữ liệu có thể khiến hệ thống gửi ra một ngoại lệ TransactionTooLargeException.

Gửi dữ liệu giữa các quy trình

Việc gửi dữ liệu giữa các quy trình cũng tương tự như việc gửi dữ liệu giữa các hoạt động. Tuy nhiên, khi gửi giữa các quy trình, bạn không nên sử dụng các gói tuỳ chỉnh. Nếu gửi một đối tượng Parcelable tuỳ chỉnh từ ứng dụng này sang ứng dụng khác, bạn cần chắc chắn rằng cùng một phiên bản của lớp tuỳ chỉnh sẽ xuất hiện trên cả ứng dụng gửi và nhận. Thông thường, đây có thể là một thư viện chung được dùng cho cả hai ứng dụng. Có thể xảy ra lỗi nếu ứng dụng của bạn cố gắng gửi một gói tuỳ chỉnh đến hệ thống, vì hệ thống không thể tổng hợp một lớp mà ứng dụng không biết.

Ví dụ: ứng dụng có thể đặt chuông báo bằng cách sử dụng lớp AlarmManager và sử dụng Parcelable tuỳ chỉnh cho ý định chuông báo. Khi chuông báo kêu, hệ thống sẽ sửa đổi Bundle của ý định bổ sung để thêm số lần lặp lại. Việc sửa đổi này có thể dẫn đến việc hệ thống sẽ xoá Parcelable tuỳ chỉnh khỏi các tuỳ chọn bổ sung. Việc loại bỏ này có thể dẫn đến sự cố của ứng dụng khi nhận được ý định chuông báo đã sửa đổi, vì ứng dụng muốn nhận thêm dữ liệu không còn tồn tại.

Vùng đệm giao dịch Binder có kích thước cố định giới hạn, hiện tại là 1MB. Kích thước này được dùng chung cho tất cả các giao dịch đang diễn ra trong quy trình này. Vì giới hạn này ở cấp quy trình thay vì ở cấp hoạt động, nên các giao dịch này bao gồm tất cả các giao dịch liên kết trong ứng dụng như onSaveInstanceState, startActivity và bất kỳ hoạt động tương tác nào với hệ thống. Khi vượt quá giới hạn kích thước, hệ thống sẽ gửi một TransactionTooLargeException.

Đối với trường hợp cụ thể của savedInstanceState, bạn nên giữ lượng dữ liệu ở mức nhỏ vì quy trình hệ thống cần giữ lại dữ liệu được cung cấp cho đến khi người dùng có thể quay lại hoạt động đó (ngay cả khi quy trình của hoạt động bị dừng). Bạn nên duy trì trạng thái đã lưu trong phạm vi dưới 50.000 dữ liệu.

Lưu ý: Trong Android 7.0 (API cấp 24) trở lên, hệ thống sẽ gửi một xảy ra TransactionTooLargeException dưới dạng ngoại lệ cho thời gian chạy. Ở các phiên bản Android thấp hơn, hệ thống chỉ hiển thị cảnh báo trong logcat.