Một gói bó trên mạng là gì trong một ứng dụng Android


Câu trả lời:


278

Các gói thường được sử dụng để truyền dữ liệu giữa các hoạt động khác nhau của Android. Nó phụ thuộc vào bạn loại giá trị bạn muốn vượt qua, nhưng các gói có thể chứa tất cả các loại giá trị và chuyển chúng sang hoạt động mới.

Bạn có thể sử dụng nó như thế này:

Intent intent = new...
Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("myKey", AnyValue);  
startActivity(intent);

Bạn có thể nhận được các giá trị được thông qua bằng cách thực hiện:

Bundle extras = intent.getExtras(); 
String tmp = extras.getString("myKey");

Bạn có thể tìm thêm thông tin tại:


3
Tại sao không trực tiếp sử dụng System.object và cast?
lovelings

78

Truyền dữ liệu giữa các hoạt động bằng cách sử dụng BundleIntentcác đối tượng.


Lần đầu tiên bạn tạo một Bundleđối tượng

Bundle b = new Bundle();

Sau đó, liên kết dữ liệu chuỗi được lưu trữ anystringvới khóa bó"myname"

b.putString("myname", anystring);

Bây giờ, tạo một Intentđối tượng

Intent in = new Intent(getApplicationContext(), secondActivity.class);

Truyền đối tượng bó bcho mục đích

in.putExtras(b);

và bắt đầu hoạt động thứ hai

startActivity(in);

Trong hoạt động thứ hai, chúng ta phải truy cập dữ liệu được truyền từ hoạt động đầu tiên

Intent in = getIntent();

Bây giờ, bạn cần lấy dữ liệu từ gói

Bundle b = in.getExtras();

Cuối cùng, lấy giá trị của dữ liệu chuỗi được liên kết với khóa có tên "myname"

String s = b.getString("myname");

ĐÂY LÀ THỰC SỰ TỐT ĐỘNG TỪ TRẢ LỜI, CẢM ƠN.
Abhishek Garg

67

Tôi phải thêm rằng các gói được sử dụng bởi các hoạt động để truyền dữ liệu cho chính chúng trong tương lai.

Khi màn hình xoay hoặc khi một hoạt động khác được bắt đầu, phương thức protected void onSaveInstanceState(Bundle outState)được gọi và hoạt động bị hủy. Sau đó, một phiên bản khác của hoạt động được tạo và public void onCreate(Bundle savedInstanceState)được gọi. Khi phiên bản đầu tiên của hoạt động được tạo, gói là null; và nếu gói không phải là null, hoạt động tiếp tục một số doanh nghiệp được bắt đầu bởi người tiền nhiệm của nó.

Android tự động lưu văn bản trong các trường văn bản, nhưng nó không lưu tất cả mọi thứ và đôi khi các lỗi tinh vi xuất hiện.

Mặc dù vậy, kiểu chống phổ biến nhất là giả định rằng onCreate()chỉ khởi tạo. Đó là sai, vì nó cũng phải khôi phục lại trạng thái.

Có một tùy chọn để vô hiệu hóa hành vi "tạo lại hoạt động xoay vòng" này, nhưng nó sẽ không ngăn chặn các lỗi liên quan đến khởi động lại, nó sẽ chỉ khiến chúng khó đề cập hơn.

Cũng lưu ý rằng phương thức duy nhất có cuộc gọi được đảm bảo khi hoạt động sắp bị hủy là onPause(). (Xem biểu đồ vòng đời hoạt động trong các tài liệu.)


Tại sao sử dụng một gói nếu chúng ta chỉ có thể sử dụng ánh xạ? Cảm ơn Ted!
Ruchir Baronia

4
Gói không chỉ được sử dụng bởi Activity. Nó cũng được sử dụng bởi Fragment để bảo toàn các trạng thái sau khi xoay.
Kai Wang

47

A Bundlerất giống một Mapđối tượng Java ánh xạ Stringcác khóa thành các giá trị. Nó được sử dụng để truyền thông tin giữa các hoạt động và các thành phần ứng dụng khác. Nó cũng được sử dụng bởi khung để nắm bắt và khôi phục thông tin trạng thái.

Lý do Android không sử dụng Mapcác đối tượng cũ đơn giản cho việc này Maplà quá linh hoạt; nó có thể chứa các đối tượng (chẳng hạn như các luồng I / O) không thể được tuần tự hóa. Các BundleAPI hạn chế các loại của các đối tượng có thể được thêm vào một bó theo cách như vậy mà nội dung của gói có bảo đảm là serializable. Khung Android dựa vào tài sản này.

Tôi đề nghị bạn nên đọc tài liệu về Nguyên tắc ứng dụng . Điều này giải thích, trong số những thứ khác, gói và ý định là gì và chúng được sử dụng để làm gì.


14

Các gói có thể được sử dụng để gửi dữ liệu tùy ý từ hoạt động này sang hoạt động khác bằng Ý định. Khi bạn phát một Ý định, các Hoạt động quan tâm (và các BroadcastRecievers khác) sẽ được thông báo về điều này. Một mục đích có thể chứa một Gói để bạn có thể gửi thêm dữ liệu cùng với Ý định.

Các gói là ánh xạ khóa-giá trị, vì vậy theo cách chúng giống như Hash, nhưng chúng không bị giới hạn nghiêm ngặt đối với ánh xạ đối tượng String / Foo. Lưu ý rằng chỉ một số loại dữ liệu nhất định được coi là "Parcelable" và chúng được phát âm rõ ràng trong API Bundle.


Đây là câu trả lời duy nhất cho đến nay để thực sự tiếp cận câu hỏi của OP, tức là một gói là gì. stackoverflow.com/a/6236801/1588163 cung cấp thêm thông tin chi tiết.
clapas

Tại sao sử dụng một gói nếu chúng ta chỉ có thể sử dụng ánh xạ? Cảm ơn!
Ruchir Baronia

@RuchirBaronia không có lý do đặc biệt để sử dụng Gói trừ khi bạn có ý định chuyển nó sang một phần của API Android yêu cầu các đối tượng Gói.
kịch bản

8

Chỉ cần tạo một gói,


Bundle simple_bundle=new Bundle();
simple_bundle.putString("item1","value1");
Intent i=new Intent(getApplicationContext(),this_is_the_next_class.class);
i.putExtras(simple_bundle);
startActivity(i);

IN "this_is_the_next_group. Class"

Bạn có thể lấy các mục như thế này.

Intent receive_i=getIntent();
Bundle my_bundle_received=receive_i.getExtras();
my_bundle_received.get("item1");
Log.d("Value","--"+my_bundle_received.get("item1").toString);

5

Gói được sử dụng để truyền dữ liệu giữa các Hoạt động. Bạn có thể tạo một gói, chuyển nó đến Ý định bắt đầu hoạt động mà sau đó có thể được sử dụng từ hoạt động đích.


3

Gói: - Ánh xạ từ các giá trị Chuỗi sang các loại Parcelable khác nhau.

Gói thường được sử dụng để truyền dữ liệu giữa các hoạt động khác nhau của Android.

khi chúng ta gọi onPause () sau đó onStop () và sau đó theo thứ tự ngược lại onStop () thành onPause ().

Dữ liệu đã lưu mà hệ thống sử dụng để khôi phục trạng thái trước đó được gọi là "trạng thái thể hiện" và là tập hợp các cặp giá trị khóa được lưu trữ trong một đối tượng Bundle.


Một bản đồ, là bản chất của bó.
BollMose

2

gói được sử dụng để chia sẻ dữ liệu giữa các hoạt động và để lưu trạng thái của ứng dụng theo phương thức oncreate () để ứng dụng sẽ biết nơi nó bị dừng ... Tôi hy vọng nó sẽ giúp :)


0

sử dụng gói gửi dữ liệu từ hoạt động này sang hoạt động khác với sự trợ giúp của đối tượng mục đích; Gói giữ dữ liệu có thể là bất kỳ loại.

Bây giờ tôi nói rằng làm thế nào để tạo bó truyền dữ liệu giữa hai hoạt động.

Bước 1: Vào hoạt động đầu tiên

Bundle b=new Bundle();

b.putString("mkv",anystring);

Intent in=new Intent(getApplicationContext(),secondActivity.class);

in.putExtras(b);

startActivity(in);

Bước 2: Vào hoạt động thứ hai

Intent in=getIntent();

Bundle b=in.getExtras();

String s=b.getString("mkv");

Tôi nghĩ rằng điều này hữu ích cho bạn ...........


0

Gói không chỉ để chuyển dữ liệu giữa hai thành phần khác nhau mà quan trọng hơn là nó được sử dụng để khôi phục các giá trị được lưu trữ trước khi hoạt động bị phá hủy thành hoạt động mới.

chẳng hạn như văn bản trong một EditTextwidget hoặc vị trí cuộn của a ListView.


0

Hoạt động đầu tiên:

String food = (String)((Spinner)findViewById(R.id.food)).getSelectedItem();
RadioButton rb = (RadioButton) findViewById(R.id.rb);
Intent i = new Intent(this,secondActivity.class);
i.putExtra("food",food);
i.putExtra("rb",rb.isChecked());

Hoạt động thứ hai:

String food = getIntent().getExtras().getString("food");
Boolean rb = getIntent().getExtras().getBoolean("rb");

1
Bạn cũng có thể muốn tìm hiểu về các ví dụ tối thiểu, đầy đủ và có thể kiểm chứng .
Daniel Corzo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.