Bundle trong Android

Sử dụng đối tượng Bundle trong Android để truyền dữ liệu giữa các Intent

Bundle trong android là một đối tượng dữ liệu được tạo ra nhằm mục dích đóng gói các dữ liệu cần được truyền qua lại giữa các Intent trong Android. Bằng cách sử dụng bundle và intent một cách nhuần nhuyễn bạn có thể truyền các gói tin dữ liệu qua lại giữa các thành phần được intent hỗ trợ sau trong lập trình Android:

  • Truyền dữ liệu giữa các Activity
  • Truyền dữ liệu giữa các Fragment (tìm hiểu thêm về Fragment tại đây: Cơ bản sử dụng Fragment trong Android)
  • Truyền dữ liệu giữa các Broadcast
  • Truyền dữ liệu giữa các Serviceprocesses

Các kiểu dữ liệu được Bundle hỗ trợ

Sau đây là danh sách các kiểu dữ liệu được đối tượng Bundle trong Android hỗ trợ

  • putInt(String key, int value), getInt(String key, int value)
  • putIntArray(String key, int[] value), getStringArray(String key, int[] value)
  • putIntegerArrayList(String key, ArrayList value), getIntegerArrayList(String key, ArrayList value value)
  • putString(String key, String value), getString(String key, String value)
  • putStringArray(String key, String[] value), getStringArray(String key, String[] value)
  • putStringArrayList(String key, ArrayList value), getStringArrayList(String key, ArrayList value value)
  • putLong(String key, long value), getLong(String key, long value)
  • putLongArray(String key, long[] value), getLongArray(String key, long[] value)
  • putBoolean(String key, boolean value), getBoolean(String key, boolean value)
  • putBooleanArray(String key, boolean[] value), getBooleanArray(String key, boolean[] value)
  • putChar(String key, char value), getChar(String key, char value)
  • putCharArray(String key, char[] value), getBooleanArray(String key, char[] value)
  • putCharSequence(String key, CharSequence value), getCharSequence(String key, CharSequence value)
  • putCharSequenceArray(String key, CharSequence[] value), getCharSequenceArray(String key, CharSequence[]
  • value)
  • putCharSequenceArrayList(String key, ArrayList value), getCharSequenceArrayList(String key, ArrayList value value)

Cách tạo và sử dụng Bundle

Để chuyển đồi dữ liệu qua lại giữa các Intent chúng ta cần làm 2 bước là tạo đối tượng Intent và tạo đối tượng Bunlde sau đó dùng các phương thức kể trên để đóng gói dữ liệu vào Bundle rồi gửi thông tin này qua lại giữa kèm theo Intent. Như ví dụ sau là cách truyền dữ liệu giữa 2 Activity

// this: là activity hiện tại
Intent intent = new Intent(this,SecondActivity.class);
Bundle bundle = new Bundle();
// đóng gói kiểu dữ liệu String, Boolean
bundle.putString("key_1", "MainActivity greeted you with a HI");
bundle.putBoolean("key_2", true);
// đóng gói bundle vào intent
intent.putExtras(bundle);
// start SecondActivity
startActivity(intent);

Để lấy ra được gói tin trong Bundle thì ta cần làm các bước như ví dụ sau

Bundle bundle = getIntent().getExtras();
String title = bundle.getString("key_1");
boolean b = bundle.getBoolean("key_2");

Một số chú ý khi sử dụng Bundle để truyền dữ liệu giữa các Activity

1.  Dữ liệu lấy ra bị lỗi NullPointerException:

Lỗi này xuất hiện khi không tồn tại giá trị với key tương ứng trong Bundle, để tránh điều này ta nên tạo thêm giá trị mặc định khi lấy dữ liệu từ Bundle

Bundle bundle = getIntent().getExtras();
String title = bundle.getString("key_1", "Default");
boolean b = bundle.getBoolean("key_2", false);[/php]

2. Xóa dữ liệu trong Bundle

Để xóa một dữ liệu hoặc key thì ta dùng phương thức remove được đối tượng hỗ trợ

bundle.remove("key_2");

Để xóa toàn bộ dữ liệu trong bundle ta dùng phương thức clear

bundle.clear()

3. Tại sao không sữ dụng phương thức putExtra của Intent

Intent trong Android có hỗ trợ phương thức putExtras để truyền dữ liệu giữa các Intent, đọc đến đây bạn sẽ hỏi vậy Bundle được tạo ra để làm gì?

Trước hết bạn hãy xem body của hàm PutExtras trong class Intent

public Intent putExtra(String name, String value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putString(name, value);
return this;
}

Rõ ràng khi ta đóng gói 1 dữ liệu nào đó thì tất cả các dữ liệu này đều được đóng gọi lại thêm một lần vào Bundle trong Intent. Do đó, không có chuyện là chỉ sử dụng phương thức putExtra của Intent để truyền các dữ liệu nhỏ, còn các dữ liệu lớn sẽ bị mất hoặc không còn nguyên vẹn khi nhận. Cả 2 cách giữa truyền trực tiếp và truyền qua Bundle đều được Intent map về đối tượng Bundle nên về mặt bộ nhớ thì không có sự khác biệt.

Vậy điểm lợi ích chính của Bundle trong Android có ý nghĩa gì? Sự minh bạch, đóng gói, làm giảm sự phức tạp của code là lợi ích chính mà người ta tạo nên đối tượng Bundle cùng xem ví dụ phía sau này bạn sẽ thấy tác dụng loại bỏ sự phức tạp khi dùng Bundle trong  phương thức khởi tạo

public class Sample {
private Bundle mBundle;
@Override
protected void onCreate(Bundle savedInstance) {
mBundle = savedInstance;
}
}

Và so sánh với class sau:
public class Sample {
private String field1;
private String field2;
private boolean field3;
@Override
protected void onCreate(String f1, String f2, boolean f3) {
this.field1 = f1;
this.field2 = f2;
this.field3 = f3;
}
}

Kevin Dang

Hey there! My name is Kevin Dang, I am website, software, mobile app develop, web admin system. Expert living in Hồ Chí Minh (Việt Nam). I am very interested in digital marketing with: SEO, Facebook, Google Ads ... This blog is where I will share the experiences, techniques and knowledge I have learned.