Implicit Intents trong Android
Android hỗ trợ 2 loại Intent khác nhau, thứ nhất là Intent tường minh (explicit) và thứ hai là Intent không tường minh (implicit). Implicit Intent trong Android còn gọi là Intent không tường minh vì nó không chỉ định tên của component sẽ bắt đầu.
Hôm nay chúng ta sẽ cùng nhau tìm hiểu về Implicit Intent.
1. Implicit Intent trong Android là gì?
Trong Android, Implicit Intent sẽ không chỉ định tên của component bắt đầu mà thay vào đó, nó chỉ rõ action cần được thực hiện và dữ liệu cho action đó, sau đó cho phép một component từ ứng dụng khác xử lý.
Ví dụ: Bằng cách sử dụng Implicit Intent, ta có thể yêu cầu một ứng dụng khác hiển thị vị trí của người dùng (như Grab, Maps,..).
Sau đây là hình ảnh minh họa cách Implicit Intent gửi yêu cầu đến hệ thống Android để bắt đầu activity.
Bài viết này được đăng tại [free tuts .net]
Activity A tạo ra một intent và action rồi gửi đến hệ thống Android bằng phương thức startActivity ()
. Hệ thống Android sẽ đối chiếu intent filter với intent của tất cả các ứng dụng. Bất cứ khi nào tìm thấy kết quả khớp, hệ thống bắt đầu chuyển tới activity (Activity B) bằng cách gọi phương thức onCreate ()
.
Cụ thể hơn, khi tạo ra một implicit intent, hệ thống Android sẽ tìm kiếm component phù hợp bằng cách so sánh nội dung của intent với các intent filter được xác định trong file manifest của các ứng dụng khác trên thiết bị. Nếu tìm thấy chỉ một component phù hợp, hệ thống sẽ khởi động component luôn. Nếu nhiều component được khớp thì hệ thống sẽ hiển thị một dialog để người dùng có thể chọn ứng dụng nào sẽ được sử dụng.
Trong Android, Intent Filter là một expression trong file manifest của ứng dụng, được sử dụng để chỉ định loại intent mà component muốn nhận. Nếu ta tạo Intent filter cho activity, các ứng dụng khác có thể bắt đầu activity bằng cách gửi intent phù hợp, nếu không thì activity chỉ có thể được bắt đầu bằng một explicit intent.
Sau đây là đoạn code minh họa về implicit intent.
Intent intent=new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.freetuts.net")); startActivity(intent);
Theo như trên minh họa, chúng ta không xác định tên component cụ thể, thay vào đó chúng ta đã xác định một action ( ACTION_VIEW
) để mở URL được xác định (freetuts.net) trong ứng dụng trình duyệt của thiết bị.
2. Ví dụ về Implicit Intent trong Android
Sau đây chúng ta sẽ đi vào ví dụ về một Implicit Intent trong ứng dụng Android để các bạn hiểu rõ hơn về loại Intent này.
Bắt đầu bằng việc tạo một ứng dụng Android mới và mở file activity_main.xml
từ đường dẫn \ src \ main \ res \ layout
rồi nhập code sau:
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.tutlane.intents.MainActivity"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/urlText" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="100dp" android:ems="10" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnNavigate" android:layout_below="@+id/urlText" android:text="Navigate" android:layout_centerHorizontal="true" /> </RelativeLayout>
Tiếp theo, mở file MainActivity.java
từ đường dẫn \ src \ main \ java \ com \ tutlane \ com.tutlane.helloworld
và viết code sau.
Code này sẽ mở url trong cửa sổ trình duyệt mới bằng cách click vào button.
MainActivity.java
package com.tutlane.intents; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText = (EditText)findViewById(R.id.urlText); Button btn = (Button) findViewById(R.id.btnNavigate); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String url = editText.getText().toString(); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } }); } }
Khi chạy ví dụ trên bằng thiết bị ảo Android (AVD),ta nhận được kết quả như hiển thị bên dưới
Khi nhập url trang web và nhấp vào button, ứng dụng sẽ mở trang web trong cửa sổ mới của ứng dụng trình duyệt. Như trong hình là bạn đã nhập domain tutlane.com.