Bài 20: Truyền dữ liệu giữa các Activity

Ở bài 19 chúng ta đã học về cách chuyển đổi qua lại giữa các activity với nhau rồi đúng không nào? Vậy thì hôm nay chúng ta sẽ tìm hiểu tiếp phần truyền dữ liệu qua giữa các activity, nó cùng dùng intent luôn đó các bạn, như bài trước mình đã nói thì chỉ có cách dùng intent mới gọi được Activity khác thôi.

Để truyền dữ liệu qua lại giữa 2 activity thì chúng ta sẽ có 2 cách làm một là sử dụng extras và một là sử dụng bundle, 2 thằng này theo mình nghĩ là tương tự nhau vì extras là một đối tượng thuộc kiểu bundle.Tuy nhiên về hiệu suất và sự tiện lợi thì việc sử dụng thì việc sử dụng bundle sẽ tốt hơn tí nữa mình sẽ nói rõ.

2 cách truyền dữ liệu qua lại giữa các Activity

Truyền bằng Extras

Đây là cách bạn thường dùng để truyền dữ liệu qua activity khác ở mức độ ít, có nghĩa là bạn chỉ truyền một vài cái gì đó qua thôi thì sử dụng Extras là khá tiện lợi và nhanh chóng.Bởi vì nó sẽ truyền theo kiểu lần lượt qua chứ không phải truyền một lần qua tất cả.Nếu trường hợp bạn muốn truyền một đống dữ liệu lớn ví dụ như từ database ra thì sử dụng thằng này sẽ không tối ưu tí nào cả và đó cũng là điểm khác nhau giữa Extras và Bundle tí nữa sẽ học qua.

Bây giờ mình sẽ tạo một ứng dụng truyền một đoạn văn bản từ ActivityA sang ActivityB hiển thị lên nhé, đây là tổng quan project:

Tổng quan project 20

Tổng quan project

Ở trên là tất cả những thứ bạn cần tạo, sau khi bấm nut button Send Data thì ta sẽ truyền nội dung của 2 EditText trên sang ActivityB và hiển thị lên 2 TextView, và dưới đây là đoạn code mình sử dụng Extras để truyền:


Ở đây mình sẽ khởi tạo một Intent với mục đích là chuyển đổi sang Activity khác, tuy nhiên bạn muốn truyền dữ liệu qua thì bạn có thể dùng nó để truyền luôn bằng cách gọi hàm putExtra(), tham số truyền vào ở đây là các cặp keyvalue.


Ở trên mình truyền vào cặp key là TITLE DESCRIPTION (2 thằng mình địa nghĩa là static để khi sang ActivityB có thể dùng lại mà không phải khởi tạo) còn value là các đoạn văn bản trong 2 EditText bạn nhập vào (bạn phải ép kiểu sang String bằng cách gọi phương thức toString() nhé vì hàm getText() không trả về kiểu String).

Sau đó gọi startActivity() và truyền vào intent để nó có thể chuyển đổi sang ActivityB. Bây giờ bên ActivityB bạn sẽ làm gì để nhận được dữ liệu này bằng cách như sau:

Đầu tiền bạn sẽ khởi tạo 1 intent bằng hàm getIntent(), tại vì sao?

Bên ActivityA đã gửi cho ActivityB một intent và truyền dữ liệu vào intent bằng cách putExtras thì bên ActivityB để nhận được dữ liệu thì phải getIntent() và tiến hành getExtras để lấy dữ liệu.


Ở ActivityA mình đã putExtras sang 2 chuỗi String với key lần lượt là TITLE và DESCRIPTION  nên bên ActivityB phải getStringExtra() và truyền và cái key là có thể lấy chính xác được dữ liệu đã gửi (tvTitle và tvContent là 2 TextView ở ActivityB mình dùng để hiển thị dữ liệu khi truyền từ ActivityA qua).

Nếu bạn gửi sang một số kiểu Interger thì khi bạn không thể gọi hàm getStringExtra() được mà phải gọi hàm getIntExtra() để nhận, cái này ở ví dụ bài tiếp theo các bạn sẽ làm rõ hơn nhé.Rất đơn giản đúng không nào, đó là kiểu truyền bằng Extras vậy còn Bundle thì sao nhỉ?

Truyền bằng Bundle

Với cách truyền bằng Extras thì bạn bỏ dữ liệu vào intent rồi gửi đi nhưng Bundle lại khác, bạn sẽ gói hết dữ liệu vào bundle vào sau đó sẽ dùng intent để gửi đi.Điều này có nghĩa là bạn sẽ gửi đi 1 lần duy nhất thôi chứ không gửi tuần tự như Extras, đây cũng là điểm khác nhau cơ bản giữa hai thằng này.

Đây là đoạn code khi sử dụng Bundle:


Thay vì bạn putExtras() vào intent thì ở đây bạn sẽ putString() vào bundle,  bạn truyền kiểu dữ liệu gì thì put kiểu dữ liệu đó nhé ví dụ: putInt(), putBoolean()…Sau khi đã put hết vào bundle thì bây giờ bạn mới truyền bundle đó qua ActivityB bằng các putExtra vào intent.


Ở trên mình put bundle qua với key là BUNDLE (public static final String BUNDLE =”bundel”).

Sau đó ở ActivityB để lấy lấy được dữ liệu trong bundle này thì bạn phải get cái bundle đã gửi qua trong intent, ở cách 1 thì bạn getStringExtra() để lấy dữ liệu vì bạn truyền vào intent là kiểu String, bây giờ bạn truyền vào kiểu Bundle thì để lấy ra bạn phải getBundleExtra() mới được.


Nhìn vào chắc các bạn hiểu ngay đúng không nào? cú put qua thằng nào thuộc kiểu dữ liệu gì thì get ra y chang kiểu dữ liệu đó là được.Dưới đây là toàn bộ code trong ActivityA và ActivityB các bạn xem nếu không hiểu đoạn nào có thể comment bên dưới blog mình sẽ trả lời ngay cho các bạn.

ActivityA.java


ActivityB.java


Nếu bạn không hiểu thì hãy xem video bên dưới đây của mình, mình đã giải thích khá rõ ràng hi vọng các bạn sẽ hiểu được phần nào đó.Bạn có thể tải source trên GITHUB về để thực hành thì mới mau lên tay được.

Video hướng dẫn truyền dữ liệu giữa các Activity với nhau

Download Source Code

Chúc các bạn thành công!

Tiếp theo

Bài 20: Truyền dữ liệu giữa các Activity
5 (100%) 3 votes

Add Comment

*