Các đối tượng Parcelable
và Bundle
đượ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 Parcelable
và Bundle
.
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.