Nghĩa của từ intent, từ intent là gì? (từ điển anh

Intent trong Android là những object tin nhắn không đồng bộ mà bạn có thể sử dụng để yêu cầu hành động từ các thành phần Android khác. Bên cạnh đó nó cho phép bạn tương tác với các thành phần từ các ứng dụng tương tự cũng như với các thành phần do các ứng dụng khác đóng góp. Ví dụ: một Activity có thể bắt đầu một Activity bên ngoài để chụp ảnh


*
*
*
*
*
*
*
Các phương thức giúp lấy dữ liệu khỏi Extra
xxx ở đây thì bạn thay thế bằng kiểu dữ liệu phù hợp với key bên “đóng gói”, ví dụ như getBooleanExtra(), getStringExtra(), getIntExtra(),… Dĩ nhiên tham số name được truyền vào phương thức này phải đúng là key bên “đóng gói” luôn.

Bạn đang xem: Nghĩa của từ intent, từ intent là gì? (từ điển anh

Có một số phương thức cần phải có tham số thứ hai, tham số đó chính là dữ liệu mặc định nếu như hệ thống không tìm thấy dữ liệu với key mà bạn đã cung cấp. Việc cung cấp tham số thứ hai này để tránh một số lỗi có thể xảy ra đối với chương trình của chúng ta.

Đoạn code sau sẽ mô phỏng cách lấy dữ liệu ra khỏi Intent bằng Extra ở onCreate() của Activity. Bạn có thể thấy từng cặp key/value khớp với khi bạn đặt dữ liệu vào trên kia.


Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact); Intent intent = getIntent(); String value1 = intent.getStringExtra("Key_1"); int value2 = intent.getIntExtra("Key_2", 0); boolean value3 = intent.getBooleanExtra("Key_3", false);}

Trường hợp dùng Bundle

Như mình nói từ đầu, Bundle và Extra không khác gì nhau hết. Nếu như Extra trên kia sẽ “xé lẻ” dữ liệu ra và gửi theo từng dòng. Thì Bundle sẽ giúp bạn “đóng gói” dữ liệu lại và gửi nguyên kiện. Tất nhiên Bundle sẽ tiện hơn trong trường hợp bạn muốn gửi cùng một bộ dữ liệu đến nhiều Activity khác nhau.

Ngoài nhiệm vụ “đóng gói” dữ liệu để truyền qua lại giữa các Activity, thì Bundle còn được dùng trong một số trường hợp khác, ví dụ như truyền dữ liệu qua Fragment mà bạn sẽ được biết ở một bài nào đó trong tương lai 😂. Nên tốt hơn hết là bạn hãy học cách sử dụng Bundle ngay từ bài này nhé.

Gửi Dữ Liệu

Chỉ có phát sinh vài dòng code so với Extra trên kia thôi, đầu tiên là dòng tạo ra Bundle. Sau đó vẫn là các dòng đặt dữ liệu vào Bundle, các dòng này có hơi khác với các dòng đặt dữ liệu vào Extra một chút, nếu với Extra bạn dùng các phương thức nạp chồng với cùng một tên putExtra() thì với Bundle bạn phải dùng đúng phương thức putxxx() với xxx là kiểu dữ liệu bạn cần dùng.


Khi Bundle đã chứa đủ dữ liệu, bạn cần phải đặt Bundle này vào trong Intent bằng một dòng code putExtras() (và nhớ là có s nha).

Bạn xem code như sau:


Intent intent = new Intent(this, ContactActivity.class);Bundle bundle = new Bundle();bundle.putString("Key_1", "Truyền một String");bundle.putInt("Key_2", 5);bundle.putBoolean("Key_3", true);intent.putExtras(bundle);startActivity(intent);
Nhận Dữ LiệuCũng tương tự như bước gửi thôi, nếu đã gửi theo kiểu Bundle, thì bên nhận cũng sẽ nên nhận theo Bundle trước rồi mới lấy từng dữ liệu ra dùng. Để lấy Bundle ra khỏi Intent thì chúng ta có phương thức getExtras().

Sau khi lấy Bundle ra khỏi Intent, việc tiếp theo sẽ gọi đến các phương thức getxxx() của nó. Các phương thức này của Bundle cũng giống như các phương thức getxxxExtra() của Extra ở trên. Chỉ khác một chỗ getxxx() của Bundle thường có hai phương thức nạp chồng, giúp bạn linh hoạt hơn. Thường thì bạn nên dùng getxxx() với hai tham số, như vậy bạn có thể định nghĩa được giá trị mặc định cho từng phương thức khi mà nó không tìm được dữ liệu từ key mà bạn cung cấp, giúp tránh một số lỗi không cần thiết.

Xem thêm:

Các phương thức giúp lấy dữ liệu khỏi BundleĐể chắc chắn thì khi nhận dữ liệu với Bundle, bạn nên kiểm tra xem Bundle đó có tồn tại hay không (kiểm tra khác null) trước nhé.


Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact); Intent intent = getIntent(); Bundle bundle = intent.getExtras(); if (bundle != null) { String value1 = bundle.getString("Key_1", ""); int value2 = bundle.getInt("Key_2", 0); boolean value3 = bundle.getBoolean("Key_3", false); }}Bạn vừa xem qua cách thức chuyển dữ liệu qua lại giữa các Activity. Giờ là lúc chúng ta thực hành xây dựng một chút cho TourNote rồi.

Thực Hành Gửi Dữ Liệu Từ MainActivity Qua ContactActivity

Thực ra ContactActivity mà mình muốn hướng đến sẽ chứa hai loại nội dung. Một là thông tin về ứng dụng, hai là thông tin giúp đỡ. Việc phân biệt nội dung nào được hiển thị sẽ dựa vào lựa chọn của người dùng trên menu item của MainActivity. Chính vì vậy chúng ta sẽ xây dựng ContactActivity sao cho có thể nhận được dữ liệu từ MainActivity chuyển qua, dữ liệu này chỉ đơn giản báo cho ContactActivity biết người dùng vừa nhấn chọn About App hay Help.

Bạn đã hiểu yêu cầu của bài thực hành hôm nay rồi đúng không nào. Nên nhớ là chúng ta chỉ nói đến cách thức gửi nhận dữ liệu để ContactActivity hiểu được chuyện gì đang xảy ra thôi nhé, do đó bài này chúng ta chỉ sử dụng Toast để kiểm chứng dữ liệu nhận. Còn việc hiển thị cái gì khi đã nhận dữ liệu thì ở bài sau chúng ta sẽ xây dựng tiếp.

Xây Dựng Các Giá Trị Hằng Số

Bạn đã biết việc sử dụng Extra hay Bundle là việc lưu trữ các dữ liệu dạng key/value rồi chuyển đi và nhận chúng ở nơi khác đúng không nào. Vậy để đảm bảo các key luôn luôn được dùng đúng, chúng ta nên định nghĩa nó là một giá trị tĩnh (static) và hằng (final). Giá trị này nên định nghĩa bên lớp nhận dữ liệu thì tốt hơn về mặt quản lý code (theo ý mình thôi nhé, bạn có thể định nghĩa một lớp chuyên chứa các giá trị key này). Do đó mình thêm các thuộc tính được tô sáng sau vào ContactActivity.


public class ContactActivity extends AppCompatActivity { public static final String KEY_SHOW_WHAT = "show_what"; public static final String VALUE_SHOW_ABOUT = "show_about"; public static final String VALUE_SHOW_HELP = "show_help";
Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); }
Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); }}

Gửi Dữ Liệu Từ MainActivity

Dĩ nhiên bên MainActivity, chúng ta chỉnh sửa một tí nơi kích hoạt ContactActivity, sao cho Intent có thể chứa Bundle mà chúng ta muốn như sau.


Overridepublic boolean onOptionsItemSelected(MenuItem item) { if(drawerToggle.onOptionsItemSelected(item)) { return true; } switch (item.getItemId()) { case R.id.search: Toast.makeText(this, "Search button selected", Toast.LENGTH_SHORT).show(); return true; case R.id.about: Intent intent = new Intent(this, ContactActivity.class); Bundle bundle = new Bundle(); bundle.putString(ContactActivity.KEY_SHOW_WHAT, ContactActivity.VALUE_SHOW_ABOUT); intent.putExtras(bundle); startActivity(intent); return true; case R.id.help: intent = new Intent(this, ContactActivity.class); bundle = new Bundle(); bundle.putString(ContactActivity.KEY_SHOW_WHAT, ContactActivity.VALUE_SHOW_HELP); intent.putExtras(bundle); startActivity(intent); return true; } return super.onOptionsItemSelected(item);}

Nhận Dữ Liệu Ở ContactActivity

Như mình có nói, ContactActivity chỉ nhận dữ liệu rồi dùng Toast để show ra làm bằng chứng là nó đã nhận đúng dữ liệu. Còn việc hiển thị cái gì thì bài học sau chúng ta sẽ nói tiếp nhé. Như vậy code của ContactActivity như sau.

public class ContactActivity extends AppCompatActivity { public static final String KEY_SHOW_WHAT = "show_what"; public static final String VALUE_SHOW_ABOUT = "show_about"; public static final String VALUE_SHOW_HELP = "show_help";
Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); Intent intent = getIntent(); Bundle bundle = intent.getExtras(); if (bundle != null) { String valueShow = bundle.getString(KEY_SHOW_WHAT, ""); Toast.makeText(this, "Show value: " + valueShow, Toast.LENGTH_SHORT).show(); } }
Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); }}
Kết quả là, tùy vào cách người dùng chọn vào menu item mà ContactActivity sẽ hiển thị Toast như sau.