Intent Android

Là Gì ?   Thursday, November 18, 2021
0 LƯỢT XEM

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

intent-trong-android

Intent trong Android là object của class android.content.Intent. Code của bạn có thể gửi Intent đến hệ thống Android với chỉ định thành phần mục tiêu gửi đến. Ví dụ, thông qua startActivity() bạn có thể xác định một Intent sử dụng để gọi chạy một Activity khác. TạiActivity mục tiêu, với startActivity() bạn có thể xác định được Intent của người gửi đến để khởi động Activitynày.

Một Intent trong Android có thể chứa dữ liệu thông qua Bundle. Dữ liệu này có thể được sử dụng bởi các receiving component (thành phần tiếp nhận).

Trong Android, việc tái sử dụng các application component khác được coi là một task. Một ứng dụng có thể truy cập các component Android khác để đạt được một task. Ví dụ: từ một component của ứng dụng, bạn có thể kích hoạt một component khác trong hệ thống Android, component đó sẽ quản lý ảnh, ngay cả khi nó không phải là một phần của ứng dụng đó. Trong component đó, bạn chọn một ảnh và quay lại ứng dụng của bạn để sử dụng ảnh đã chọn.

Một dòng sự kiện đó sẽ được mô tả như sau:

intent-trong-android
Intent được sử dụng để:
  1. Bắt đầu một Activity: startActivity(intent)
  2. Bắt đầu một Activity con
  3. Bắt đầu một dịch vụ (Service): startService(Intent)

Cách bắt đầu một Activity hoặc Service

Để bắt đầu một Activity chúng ta sẽ sử dụng method startActivity(intent). Method này được định nghĩa trên đối tượng Context mà Activity mở rộng.

intent-trong-android

Đoạn mã sau minh họa cách bạn có thể bắt đầu một Activity khác thông qua một Intent:

# Start the activity connect to the # specifiedclass Intent i = new Intent(this, ActivityTwo.class); startActivity(i);

Các Activity được khởi động bằng các Activity Android khác gọi là sub-Activity.

Còn để khởi động một Service thông qua Intent trong Android ta dùng method startService(Intent)

Tham khảo thêm: Tuyển dụng lập trình Android lương cao tại Topdev

Các loại Intent

Intent trong Android hiện có 2 loại là Intent tường minh (explicit) và Intent không tường minh (implicit).

Một ứng dụng có thể xác định thành phần mục tiêu một cách trực tiếp vàoIntent (explicit) mục tiêu được yêu cầu là rõ ràng hoặc yêu cầu hệ thống Android đánh giá các thành phần đã đăng ký trên dữ liệu đích để chọn ra một cái để gửi yêu cầu đến (Intent implicit).

  • Intent tường minh (explicit)

Intent tường minh (Explicit intents): Là những intent chỉ định rõ ràng tên của các thành phần mục tiêu để xử lý; trong đó, trường mục tiêu (tùy chọn) được sét một giá trị cụ thể thông qua các phương thức setComponent() hoặc setClass().

intent-trong-android

Ví dụ khởi tạo Intent:

Intent intent = new Intent(this,GreetingActivity.class); intent.putExtra("firstName",firstName); intent.putExtra("lastName", lastName); this.startActivity(intent); this.startActivityForResult(intent, MY_REQUEST_CODE);

Hoặc sử dụng Bundle:

// Cách 1. Intent mIntent = new Intent(this, GreetingActivity.class); Bundle extras = mIntent.getExtras(); extras.putString("firstName", "<firstName>"); extras.putString("látName", "<lastName>"); // Cách 2. Intent mIntent2 = new Intent(this, GreetingActivity.class); Bundle mBundle = new Bundle(); mBundle.putString("firstName", "<firstName>"); mBundle.putString("látName", "<lastName>"); mIntent2.putExtras(mBundle); // Cách 3: Intent mIntent3 = new Intent(this, GreetingActivity.class); mIntent3.putExtra("firstName", "<firstName>"); mIntent3.putExtra("látName", "<lastName>");

Tại Activity:

Intent intent = this.getIntent(); String firstName= intent.getStringExtra("firstName"); String lastName = intent.getStringExtra("lastName"); // Hoặc Bundle extras = this.getIntent().getExtras(); String firstName1 = extras.getString("firstName"); String lastName2 = extras.getString("lastName");
  • Intent không tường minh (Implicit)

Intent không tường minh (Implicit Intents): Là những intent không chỉ định rõ một mục tiêu thành phần, nhưng bao gồm đầy đủ thông tin cho hệ thống để xác định các thành phần có sẵn là tốt nhất để chạy cho mục đích đó. Hãy xem xét một ứng dụng liệt kê các nhà hàng có sẵn ở gần bạn. Khi bạn bấm vào một tùy chọn nhà hàng cụ thể, ứng dụng sẽ hỏi một ứng dụng khác để hiển thị các tuyến đường đến nhà hàng đó. Để đạt được điều này, nó có thể gửi một ý định rõ ràng trực tiếp đến các ứng dụng Google Maps, hoặc gửi intent implicit, ý định sẽ được chuyển giao cho bất kỳ ứng dụng nào cung cấp các tính năng bản đồ (map) (chẳng hạn, Yahoo Maps).

intent-trong-android

Ví dụ:

Intent intent=newIntent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.tutlane.com")); startActivity(intent);

Truyền dữ liệu cho intent explicit và implicit intent

Android hỗ trợ cho intent explicit và intent implicit. Một ứng dụng có thể xác định thành phần đích (target component) trực tiếp trong intent (intent explicit) hoặc yêu cầu hệ thống Android đánh giá các component đã đăng ký dựa trên dữ liệu intent (intent implicit).

Intent explicit sẽ xác định chính xác thành phần sẽ được gọi bởi hệ thống Android, bằng cách sử dụng lớp Java để định danh. Intent explicit thường được sử dụng để kiểm soát ứng dụng. Sau đây là cách tạo một intent explicit và gửi nó đến hệ thống Android để bắt đầu một Activity.

Intent i = new Intent(this, ActivityTwo.class); i.putExtra("Value1", "This value one for ActivityTwo "); i.putExtra("Value2", "This value two ActivityTwo");

Intent implicit chỉ định hành động cần được thực hiện và dữ liệu tùy chọn, cung cấp nội dung cho hành động. Nếu một intent implicit được gửi đến hệ thống Android, nó sẽ tìm kiếm tất cả các component được đăng ký cho hành động cụ thể và kiểu dữ liệu phù hợp. Nếu chỉ tìm thấy một component, Android sẽ khởi động trực tiếp component này. Nếu một số component được hệ thống Android xác định, người dùng sẽ nhận được hộp thoại lựa chọn và có thể quyết định component nào sẽ được sử dụng cho mục đích.

Ví dụ:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.vogella.com/")); startActivity(i);

Xác định bộ nhận intent hợp lệ

Đôi khi bạn muốn xác định xem một component đã đăng ký một intent hay chưa. Ví dụ: bạn muốn kiểm tra xem có sẵn một bộ nhận intent nhất định hay không và trong trường hợp có sẵn một component, bạn bật một chức năng trong ứng dụng của mình.

Việc kiểm tra này có thể được thực hiện thông qua lớp PackageManager.

Đoạn code sau sẽ kiểm tra xem một component có đăng ký một intent nhất định hay không. Xây dựng intent của bạn như bạn mong muốn để kích hoạt nó và chuyển nó đến method sau.

public static boolean isIntentAvailable(Context ctx, Intent intent) { final PackageManager mgr = ctx.getPackageManager(); List<ResolveInfo> list = mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; }

Dựa trên kết quả, bạn có thể điều chỉnh ứng dụng của mình. Ví dụ: bạn có thể tắt hoặc ẩn các mục menu nhất định.

Các kiểu dữ liệu trong Intent

Qua những kiến thức ở trên bạn đã biết rằng, Intent trong Android có khả năng chuyển dữ liệu qua các Activity. Vậy cách thức hoạt động của quá trình đó như thế nào?

Dữ liệu được truyền vào Intent và lấy ra theo các cặp dữ liệu dạng key/value. Key ở đây là một chuỗi, giúp định danh cho kiểu dữ liệu value. Nếu bạn truyền vào trong Intent cặp dữ liệu key/value nào, thì bạn phải lấy ra bởi đúng cặp key/value đó, chắc chắn khai báo đúng key và lấy ra đúng kiểu củavalue khi được truyền vào.

Tuy vậy, bạn có thể sử dụng một trong hai hình thức sau. Sử dụng Extra hoặc là Bundle. Thật sự thì khác nhau giữa hai hình thức cũng không quan trọng lắm, chỉ là bạn nên biết cả hai cách và mình sẽ đưa ra chút lời khuyên phân tích trường hợp nào nên sử dụng cách nào ở bên dưới.

Trường hợp dùng Extra

Theo mình truyền nhận dữ liệu bằng Extra là cách đơn giản nhất.

Gửi Dữ Liệu

Bước đầu tiên, để truyền dữ liệu bằng Extra. Sau khi khai báo Intent và trước khi bạn dùng nó để kích hoạt một activity nào đó, bạn có thể sử dụng các phương thức được nạp chồngcủa nó để gửi dữ liệu. Các phương thức đó có chung một tên làputExtra().

intent-trong-android

Có một điều bạn cần lưu ý là các phương thức putExtra() này không có chữ s ở đằng sau Extra nhé. Extra mà có s thì sẽ dành cho Bundle ở bên dưới.

Với mỗiputExtra() như vậy, tham số đầu tiên sẽ chính là key mà mình nói trên kia. Tham số thứ hai chính là value. Phương thức này được nạp chồng làm nhiều bản để bạn dễ dàng sử dụng từng loạivalue mà bạn muốn. Tuy nhiên có 2 kiểu value bạn đừng để ý đếnlà Parcelable và Serializable, hai kiểu này hơi phức tạp một chút, có lẽ lần sau mình sẽ có một bài viết riêng về hai kiểu này khi thích hợp.

Đoạn code sau ví dụ cách để truyền dữ liệu vào Intent bằng Extra.

Intent intent = new Intent(this, ContactActivity.class); intent.putExtra("Key_1", "Truyền một String"); intent.putExtra("Key_2", 5); intent.putExtra("Key_3", true); startActivity(intent);

Nhận Dữ Liệu

Đến bước này, theo như ví dụ trên thì ContactActivity sẽ được kích hoạt với dữ liệu là ba cặp key/value được truyền vào. Ở phương thức onCreate()hoặc bất cứ chỗ nào củaContactActivity, bạn đều có thể lấy bất cứ cặpkey/valuenào ra dùng. Bằng cách gọi đếngetxxxExtra().

intent-trong-androidCá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.

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ặpkey/value khớp với khi bạn đặt dữ liệu vào trên kia.

@Override protected 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ùngBundle

Như mình nói từ đầu, BundlevàExtrakhô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ớiExtratrên kia thôi, đầu tiênlà dòng tạo raBundle. Sau đó vẫn là các dòng đặt dữ liệu vàoBundle, các dòng này có hơi khác với các dòng đặt dữ liệu vàoExtramột chút, nếu vớiExtrabạn dùng các phương thức nạp chồng với cùng một tênputExtra()thì vớiBundlebạn phải dùng đúng phương thứcputxxx()với xxx là kiểu dữ liệu bạn cần dùng.

intent-trong-android

KhiBundleđã chứa đủ dữ liệu, bạn cần phải đặtBundlenày vào trongIntentbằng một dòng codeputExtras() (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ệu

Cũ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ấyBundlera khỏiIntent, việc tiếp theo sẽ gọi đến các phương thứcgetxxx() 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.

intent-trong-androidCá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ớiBundle, bạn nên kiểm tra xemBundleđó có tồn tại hay không (kiểm tra khácnull) trước nhé.

@Override protected 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 raContactActivitymà 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ủaMainActivity. Chính vì vậy chúng ta sẽ xây dựngContactActivitysao cho có thể nhận được dữ liệu từMainActivitychuyển qua, dữ liệu này chỉ đơn giản báo choContactActivitybiết người dùng vừa nhấn chọnAbout ApphayHelp.

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 đểContactActivityhiểu được chuyện gì đang xảy ra thôi nhé, do đó bài này chúng ta chỉ sử dụngToastđể 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ụngExtrahayBundlelà việc lưu trữ các dữ liệu dạngkey/valuerồi chuyển đi và nhận chúng ở nơi khác đúng không nào. Vậy để đảm bảo cáckeyluô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ịkeynày). Do đó mình thêm các thuộc tính được tô sáng sau vàoContactActivity.

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ênMainActivity, chúng ta chỉnh sửa một tí nơi kích hoạtContactActivity, sao choIntentcó thể chứaBundlemà chúng ta muốn như sau.

@Override public 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,ContactActivitychỉ nhận dữ liệu rồi dùngToastđể 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ủaContactActivity 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àContactActivitysẽ hiển thịToastnhư sau.

intent-trong-androidHình ảnh TourNote sau khi thực hành

Kết bài

Như vậy mình đã chia sẻ những kiến thức rất căn bản để có thể hiểu bản chất Intent trong Android cũng như cách chúng truyền dữ liệu cho nhau. Các bạn hãy nhớ rằng Intent là một phần cực kỳ quan trọng. Và nếu như chưa hiểu phần nào thì các bạn hãy comment bên dưới để mình và mọi người cùng hỗ trợ nhé. Chúc anh em sẽ thành công hơn

Có thể bạn muốn xem thêm:

  • Retrofit là gì? Những kiến thức cần nắm về Retrofit trong Android
  • 10 tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao
  • Tạo và xuất bản một thư viện cho Android

Xem thêm cácviệc làm androidhấp dẫn tạiTopDev

Video liên quan

logoblog

Bài viết liên quan

  • Cách bấm máy tính môn nguyên lý thống kê
  • Intent Android
  • Cách bấm hoán vị trên máy tính 580
  • Cách đồng bộ tin nhắn Zalo trên máy tính
  • Cách sửa điện thoại bị đứng máy
  • Cách an ảnh trên dòng thời gian Facebook
  • Cách scan tài liệu thành file PDF trên iPhone
  • Cách tháo ổ đĩa Laptop ASUS
  • Cách hiển thị phần Giới thiệu trên Facebook
  • Can you share a playlist with someone on Apple Music
  • Cách kết nối wifi trên máy tính
  • Cách bấm máy tính rút gọn biểu thức lượng giác
  • Nhận xét bài viết