Làm việc với Intent trong Phát triển ứng dụng Android
Bài đăng này đã không được cập nhật trong 8 năm
1. Giới thiệu
Android đã cung cấp ra một cấu trúc lập trình yêu cầu các hành động từ một trong các thành phần tạo nên ứng dụng như Activity
, Services
, Content Providers
và Broadcast Receiver
. Tính năng này được gọi là Intent
.
1. Khái niệm cơ bản
Intent
chủ yếu được sử dụng trong 3 kịch bản :
a. Bắt đầu mở một Activity
Activity
được biết đến như là một màn hình duy nhất trong ứng dụng. Mỗi màn hình mới được bật lên trong ứng dụng đều sẽ là một Activity
. Chúng ta có thể bắt đầu một Activity mới bằng cách gọi hàm startActivity
, mà dùng Intent
như một tham số.
Nếu Intent
chỉ để sử dụng như là một kết quả mà muốn nhận được khi ta muốn xử lý tại một Activity
khác sau đó nhận về kết quả thì sử dụng method startActivityForResult
. Khi gọi startActivityForResult
ở Activity muốn nhận kết quả thì hãy override hàm onActivityResult
.
b. Chạy Services
Services
được chạy dưới background và không có giao diện. Để bắt đầu chạy Services
ở đây tôi sẽ sử dụng Intent
như một tham số để truyền vào hàm
startService()
Hàm bindService()
được sử dụng để tạo ràng buộc một ứng dụng cho một dịch vụ khi làm việc với một giao diện phục vụ khách hàng.
c. Gửi Broadcast Message
Broadcast Message
là message bất kỳ mà ứng dụng sẽ nhận được ví dụ như khởi động lại hệ thống (system booting), thiết bị bắt đầu sạc (device charging started), thiết bị nhận được tin nhắn (receive sms) .v.v. Để gửi đi các broadcast message
chúng ta dùng hàm sendBroadcast()
(cũng có thể dùng các hàm sendOrderedBroadcast()
và sendStickyBroadcast()
.
2. Các loại Intent
Intent
có hai loại là : implicit (ngầm) và explicit (rõ ràng).
Implicit Intent
là chỉ định thực hiện hành động chung chung và không xác định bất kỳ một thành phần cụ thể nào. Một ví dụ điển hình như bạn muốn chia sẻ bức ảnh và hiển thị một cửa sổ để bạn có thể chọn cách chia sẻ thông qua (Email, Bluetooth, SMS, WhatsApp, Facebook .v.v.).Explicit Intent
: intent đã được xác định thuộc tính component, nghĩa là đã chỉ rõ thành phần sẽ nhận và xử lý intent. Thông thường intent dạng này sẽ không bổ sung thêm các thuộc tính khác như action, data.Explicit Intent
thương được sử dụng để khởi chạy các activity trong cùng 1 ứng dụng. Để tạo mộtIntent
, bạn cần phải cung cấp các tham số :
1. Hành động (Action)
Điều này mô tả các hành động được thực hiện (Ví dụ : VIEW, PICK, và LIKE).
2. Tên thành phần (Component Name)
Điều này là không cần thiết cho một Implicit Intent
, nhưng là cần thiết cho một Explicit Intent
. Nó luôn luôn là cần thiết khi bạn muốn gọi một Service
3. Dữ liệu (Data)
Đây là hình thức một URI chứa dữ liệu phải được hoạt động sau khi gọi Action. Ví dụ, nếu bạn muốn mở một tập tin đã tải về, đường dẫn tới các tập tin đã tải về sẽ là một phần của dữ liệu. Bạn cũng cần phải chỉ rõ loại dữ liệu.
4. Thể loại (Category)
Điều này có chứa các dữ liệu (Data) bổ sung về loại thành phần nên xử lý các Intent
.
5. Tính năng bổ sung (Extras)
Điều này có chứa thông tin bổ sung có thể được yêu cầu để hoàn thành hành động (Action).
6. Cờ (Flag)
Điều này thông báo cho hệ điều hành Android làm thế nào để khởi động một Activity và xử lý nó sau khi khởi động của nó.
2. Tạo ứng dụng đơn giản để thể hiện việc sử dụng Intent
Ở đây mình sẽ sử dụng Android Studio để tạo ứng dụng demo nhé
Tên ứng dụng của mình sẽ là IntentsDemo
Sau khi tạo xong ứng dụng thì trên MainActivity
tôi sẽ add 2 TextView
và 2 Button
Ở file layout của MainActivity
có tên là activity_main.xml
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Call Another Activity"
android:id="@+id/buttonScenario1"
android:layout_below="@+id/textView"
android:layout_toRightOf="@+id/textView"
android:layout_toEndOf="@+id/textView"
android:layout_marginTop="84dp"
android:onClick="onButtonScenario1Click" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Call Activity and Return"
android:id="@+id/buttonCallReturnableActivity"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/buttonScenario1"
android:layout_alignStart="@+id/buttonScenario1"
android:onClick="onButtonCallReturnableActivityClick" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Return Code"
android:id="@+id/textViewReturnCode"
android:layout_below="@+id/buttonCallReturnableActivity"
android:layout_centerHorizontal="true"
android:layout_marginTop="62dp" />
</RelativeLayout>
Và tôi sẽ tạo thêm 2 Activity nữa có tên là Scenario1Activity
và ReturnScenarioActivity
để sử dụng 2 method là startActivity
và startActivityForResults
Tương ứng với 2 activity trên sẽ có 2 file layout có tên :
activity_scenario1.xml
và activity_return_scenario.xml
activity_scenario1.xml
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.vipul.intentsdemo.Scenario1Activity" >
<TextView android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Complete"
android:id="@+id/buttonComplete"
android:onClick="onButtonClick"
android:layout_below="@+id/textView2"
android:layout_toRightOf="@+id/textView2"
android:layout_toEndOf="@+id/textView2"
android:layout_marginTop="115dp" />
</RelativeLayout>
activity_return_scenario.xml
<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.vipul.intentsdemo.
ReturnScenarioActivity">
<TextView android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Return to Main Activity"
android:id="@+id/buttonReturn"
android:layout_below="@+id/textView"
android:layout_toRightOf="@+id/textView"
android:layout_toEndOf="@+id/textView"
android:layout_marginTop="129dp"
android:onClick="onButtonReturnClick" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText1"
android:layout_marginTop="48dp"
android:text="Enter Return value"
android:layout_below="@+id/textView"
android:layout_alignRight="@+id/buttonReturn"
android:layout_alignEnd="@+id/buttonReturn />
</RelativeLayout>
Sau khi tạo layout xong thì chúng ta có thể bắt đầu code các sự kiện khác nhau trên các Activity. Mở file Scenario1Activity.java và thực thi hàm onButtonClick
//Scenario1Activity.java
// Chúng ta không làm gì ở đây cả chỉ gọi hàm finish để hoàn thành //Activity
public void onButtonClick(View v) {
finish();
}
Tiếp theo, chúng ta thực thi sự kiện onclick của layout activity_return_scenario.xml
//Returnscenarioactivity.java
public void onButtonReturnClick(View v) {
EditText editText1=(EditText)findViewById(R.id.editText1);
String str = editText1.getText().toString();
Intent intent=new Intent();
intent.putExtra("MyMessage",str);
setResult(RESULT_OK,intent);
finish();
}
Cuối cùng, chúng ta sẽ thực hiện mọi việc tại Mainactivity class.
Đầu tiên, Chúng ta sẽ tạo khởi tạo một TextView Làm biến toàn cục.
//MainActivity.java
public class MainActivity extends ActionBarActivity {
TextView tView;
Tiếp theo, chúng ta thực thi các sự kiện onlick
//Mainactivity.java
public void onButtonScenario1Click(View v) {
Intent intentScenario1 =
new Intent(this, Scenario1Activity.class);
this.startActivity(intentScenario1);
}
public void onButtonCallReturnableActivityClick(View v) {
Intent intentReturnableActivity =
new Intent(this, ReturnScenarioActivity.class);
this.startActivityForResult(intentReturnableActivity, 100);
}
Cuối cùng, chúng ta override lại hàm OnActivityResult
. hàm này sẽ được gọi khi Activity
ReturnScenarioActivity complete (Nhớ rằng khi chúng ta sử dụng startActivityForResult() thay cho startActivity() để bật acitivity)
//MainActivity.java
@Override
protected void onActivityResult(int requestCode,
int returnCode, Intent intent) {
super.onActivityResult(requestCode, returnCode, intent);
if(returnCode == 50) {
tView= (TextView) findViewById(R.id.textViewReturnCode);
tView.setText(intent.getStringExtra("MyMessage"));
}
}
Ứng dụng của chúng ta đã hoàn thành. Nếu bạn gặp rắc rối có thể download mã nguồn dưới cuối bài viết. Khi chúng ta chạy ứng dụng và chọn Scenario1. có mở ra một màn hình mới nhưng nó không có chút thú vị nào. Tuy nhiên khi bạn chọn option thứ 2, Nhưng giá trị trong trường EditText khi được thay đổi và bạn bấm nút hoàn thành thì các giá trị tại EditText sẽ được hiển thị ngoài MainActivity.
Tổng kết
Trong bài này, chúng ta đã học được về ý định khái niệm cơ bản và sử dụng các Intents trong các ứng dụng Android. Tôi hy vọng bạn đã tìm thấy thông tin này hữu ích.
Các Nguồn Tham khảo : http://developer.android.com/reference/android/content/Intent.html
All rights reserved