2011-09-24 27 views
10

Trong khi sử dụng đối tượng Intent chúng ta có thể đặt các loại dữ liệu khác nhau trực tiếp bằng cách sử dụng putExtra(). Chúng tôi cũng có thể đặt những dữ liệu bổ sung này vào một đối tượng Bundle và thêm nó vào Intent. Vậy tại sao chúng ta cần Bundle nếu chúng ta có thể sử dụng trực tiếp Intent?Quan hệ Intent and Bundle

Trả lời

7

Đôi khi bạn cần phải vượt qua chỉ là một few variables hoặc values một số khác Activity, nhưng những gì nếu bạn có một bunch of variable's or values mà bạn cần phải vượt qua để khác nhau Activities. Trong trường hợp đó, bạn có thể sử dụng Bundle và chuyển số Bundle đến mức yêu cầu Activity một cách dễ dàng. Thay vì chuyển từng biến đơn.

+1

Xin lỗi nhưng điều này là sai, hãy kiểm tra câu trả lời của tôi để biết lý do. – Reno

+0

'mExtras = new Bundle();' điều này có đủ thuyết phục không? Nếu không tự mình kiểm tra mã nguồn của 'Intent.java'. – Reno

3

Giả sử bạn cần chuyển một số Bundle từ một số Activity cho một số khác. Đó là lý do tại sao Intent cho phép bạn thêm Bundle s làm trường bổ sung.

EDIT: Ví dụ, nếu bạn muốn vượt qua một hàng từ một cơ sở dữ liệu cùng với một số dữ liệu khác đó là rất thuận tiện để đặt hàng này thành một Bundle và thêm Bundle này đến Intent như một trường bổ sung.

+0

tôi đang hỏi tại sao? chúng ta sẽ đặt cùng một dữ liệu bổ sung trong gói và thêm bó đó vào đối tượng intent.that chúng ta có thể đặt trực tiếp vào đối tượng intent.Is không phải là nó? –

+0

Không, không phải vậy. Bạn chỉ có thể có một 'Bundle' mà bạn cần phải vượt qua. Bạn có thực sự muốn sao chép trường theo trường thành 'Intent'. Và nếu các khóa của 'Bundle' và' Intent' sẽ chồng lên nhau? Bạn không thể biết tất cả những gì mọi người làm như vậy chỉ cần nhớ rằng bạn có thể đặt một 'Bundle' vào một' Intent' và khi bạn cần nó, bạn sẽ biết phải làm gì. – Michael

+0

Một ví dụ nhỏ: bạn muốn chuyển một hàng từ cơ sở dữ liệu cùng với một số dữ liệu khác. Rất thuận tiện để lưu trữ hàng này trong một 'Gói '. Trong một trong các ứng dụng của tôi, tôi sử dụng một danh sách 'Bundle' để truyền một số hàng từ một cơ sở dữ liệu. – Michael

15

Như bạn thấy, Intent lưu trữ nội bộ trong một Bundle.

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

Tôi đoán những gì @Lalit có nghĩa là giả hoạt động của bạn luôn luôn vượt qua các biến cùng với ý đồ khác nhau, bạn có thể lưu trữ tất cả trong số họ trong một đơn Bundle trong lớp học của bạn và chỉ cần sử dụng bất cứ khi nào bạn cần intent.putExtras(mBundle) cùng một bộ thông số.

Điều đó sẽ làm cho việc thay đổi mã dễ dàng hơn nếu một trong các tham số trở nên lỗi thời trong mã của bạn. Giống như:

public class MyActivity { 
    private Bundle mBundle; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     mBundle = new Bundle(); 
     mBundle.putString("parameter1", value1); 
     mBundle.putString("parameter2", value2); 
    } 
    private void openFirstActivity() { 
     Intent intent = new Intent(this, FirstActivity.class); 
     intent.putExtras(mBundle); 
     startActivity(intent); 
    } 
    private void openSecondActivity() { 
     Intent intent = new Intent(this, SecondActivity.class); 
     intent.putExtras(mBundle); 
     startActivity(intent); 
    } 
} 

OBS: Như đã trình bày rồi, Intent lưu trữ các thông số trong một nội Bundle, và nó đáng chú ý là khi bạn gọi putExtras, bó Ý định nội bộ không trỏ đến cùng một đối tượng, nhưng tạo một bản sao của tất cả các biến thay vào đó, bằng cách sử dụng một đơn giản for như thế này:

for (int i=0; i<array.mSize; i++) { 
    put(array.keyAt(i), array.valueAt(i)); 
} 
Các vấn đề liên quan