12/08/2018, 13:24

Làm việc với Intent trong Phát triển ứng dụng Android

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 Providersvà 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ở ...

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 Providersvà 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ột Intent, 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ó.

Ở đâ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_awidth="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_awidth="wrap_content"
      android:layout_height="wrap_content" />
   <Button
      android:layout_awidth="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_awidth="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_awidth="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_awidth="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_awidth="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textView2" />

   <Button
      android:layout_awidth="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_awidth="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_awidth="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textView" />

   <Button
      android:layout_awidth="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_awidth="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.

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.

Source.

Các Nguồn Tham khảo : http://developer.android.com/reference/android/content/Intent.html

0