Lô và gói

Các đối tượng ParcelableBundle được dùng để được sử dụng trên ranh giới của quy trình, chẳng hạn như với IPC/Binder giao dịch, giữa các hoạt động có ý định và để lưu trữ trạng thái tạm thời trên cấu hình thay đổi. Trang này cung cấp 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à mục đích chung cơ chế chuyển đổi tuần tự và bạn không bao giờ 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 một ứng dụng tạo một đối tượng Intent để dùng trong startActivity(android.content.Intent) để bắt đầu một Hoạt động mới, ứng dụng có thể chuyển vào bằng cách sử dụng 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 bổ Bundle cơ bản của ý định. Sau đó, hệ điều hành tạo hoạt động mới, tách các gói 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 vào Đối tượng Intent. Lớp Bundle đạt mức cao được tối ưu hoá cho việc dồn và tách dữ liệu 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 có 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 writeToParcel(android.os.Parcel, int). Tệp này cũng phải cung cấp một trường không có giá trị rỗng có tên là CREATOR triển khai giao diện Parcelable.Creator, createFromParcel() được dùng để chuyển đổi Parcel về đối tượng hiện tại. Để biết thêm thông tin, hãy xem tài liệu tham khảo cho đối tượng Parcelable.

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

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ư thực hiện 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 sản phẩm có thể tuỳ chỉnh. Nếu bạn gửi một tuỳ chỉnh Parcelable từ ứng dụng này sang ứng dụng khác, thì bạn cần chắc chắn rằng cùng một phiên bản của lớp tùy chỉnh là hiển thị trên cả ứng dụng gửi và nhận. Thông thường, đây có thể là một thư viện phổ biến được sử dụng trên 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 bưu kiện tuỳ chỉnh đến hệ thống vì hệ thống không thể so sánh một lớp mà nó 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 về ý định của chuông báo. Khi chuông báo kêu, hệ thống sẽ sửa đổi ý định Bundle lợi ích bổ sung cần 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 xoá bỏ Parcelable từ các lợi ích bổ sung. Việc gỡ bỏ này có thể dẫn đến việc ứ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 nhận được dữ liệu bổ sung không còn ở đó.

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

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

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