Lô và gói

Các đối tượng ParcelableBundle được dùng trên các ranh giới xử lý, chẳng hạn như với các giao dịch IPC/Binder, giữa các hoạt động có ý định và để lưu trữ trạng thái tạm thời trên các thay đổi về cấu hình. Trang này cung cấp các đề xuất và phương pháp hay nhất để sử dụng các đố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 bao giờ được lưu trữ bất kỳ dữ liệu Parcel nào trên ổ đĩa hoặc gửi dữ liệu đó qua mạng.

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

Khi một ứng dụng tạo đối tượng Intent để dùng trong startActivity() khi 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().

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

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

Hệ điều hành phân chia Bundle cơ bản của ý định. Sau đó, hệ điều hành sẽ tạo hoạt động mới, giải mã dữ liệu và truyền ý định đến hoạt động mới.

Bạn nên dùng lớp Bundle để đặt các kiểu dữ liệu nguyên thuỷ 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 để sắp xếp và huỷ sắp xếp bằng cách sử dụng các gói.

Trong một số trường hợp, bạn có thể cần truyền các đối tượng phức tạp giữa các hoạt động hoặc giữ lại các đối tượng đó trong trạng thái giao diện người dùng. Trong những trường hợp như vậy, lớp tuỳ chỉnh phải triển khai Parcelable. Đối với các ứng dụng Kotlin và Jetpack Compose hiện đại, phương pháp nên dùng là sử dụng chú thích @Parcelize. Thao tác này sẽ tự động tạo logic chuyển đổi tuần tự cần thiết để xử lý dữ liệu một cách an toàn khi sử dụng Gói. Đây là phương pháp tương tự được dùng để xử lý dữ liệu của bạn khi bạn sử dụng rememberSaveable. Để biết thêm thông tin về cách sử dụng @Parcelize, hãy xem bài viết Trình tạo lượt triển khai 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 đưa 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 đối tượng có thể chuyển đổ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 đảm bảo rằng phiên bản chính xác của lớp tuỳ chỉnh có 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 trên cả hai ứng dụng. Lỗi có thể xảy ra nếu ứng dụng của bạn cố gắng gửi một đối tượng có thể chuyển đổi tuỳ chỉnh đến hệ thống, vì hệ thống không thể huỷ chuyển đổi một lớp mà hệ thống không biết.

Ví dụ: một ứng dụng có thể đặt chuông báo bằng lớp AlarmManager và sử dụng Parcelable tuỳ chỉnh trên ý định chuông báo. Khi chuông báo thức đổ chuông, hệ thống sẽ sửa đổi Bundle của ý định về các phần bổ sung để thêm số lần lặp lại. Việc sửa đổi này có thể khiến hệ thống xoá Parcelable tuỳ chỉnh khỏi các phần bổ sung. Việc loại bỏ này có thể khiến ứng dụng gặp sự cố khi nhận được ý định báo thức đã sửa đổi, vì ứng dụng dự kiến sẽ nhận được dữ liệu bổ sung 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 là 1 MB) và được chia sẻ bởi tất cả các giao dịch đang diễn ra cho quy trình. Vì giới hạn này ở cấp quy trình chứ không phải ở cấp độ mỗi 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, chẳng hạn như startActivity, rememberSaveable (sử dụng onSaveInstanceState ở chế độ nền) và mọi hoạt động tương tác với hệ thống. Khi vượt quá giới hạn kích thước, một TransactionTooLargeException sẽ được gửi.

Đối với trường hợp cụ thể lưu trạng thái bằng rememberSaveable, bạn nên giữ lượng dữ liệu ở mức nhỏ vì quy trình hệ thống cần giữ dữ liệu đã 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ị huỷ). Bạn nên giữ trạng thái đã lưu ở mức dưới 50 KB dữ liệu.

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