Bài 5: Intent trong Android

Contents

1 Intent là gì?2 Các loại Intent2.1 Intent tường minh2.1.1 Ví dụ với Intent tường minh2.2 Intent không tường minh2.2.1 Ví dụ dễ làm với Intent không tường minh

Intent là gì?

Intent (ý định) là những tin nhắn không đồng bộ cấp quyền các thành phần app yêu cầu chức năng từ các thành phần Android khác. Intents cấp quyền bạn tương tác với các thành phần từ các app như nhau tương tư với các thành phần đóng gói trong một app khác. Ví dụ, một Activity có thể gọi một Activity bên ngoài để chụp ảnh.

Intent là đối tượng của class android.content.Intent. Mã của bạn có thể gửi Intent vào hệ thống Android với chỉ định thành phần mục tiêu gửi đến.

Ví dụ thông qua phương thức startActivity(), bạn có thể được hiểu một Intent dùng để gọi chạy một Activity khác. Tại Activity mục tiêu, thông qua phương thức startActivity() bạn có thể xác định được ý định của người gửi đến để bắt đầu (start) Activity này.

Một Intent có thể chứa data thông qua một Bundle. data này có thể được dùng bởi các thành phần tiếp nhận.

Intent có thể dùng để:

Bắt đầu một Activity Bắt đầu một Activity con. Bắt đầu một dịch vụ (Service).

Các loại Intent

Intent tường minh

Intent tường minh (Explicit intents): Là những ý định (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 (option) được set một giá trị cụ thể thông qua các phương thức setComponent() hoặc setClass(). Ví dụ tạo Intent:

// Tạo một Intent với mục tiêu là SecondActivity.class.

// Intent(FirstActivity, SecondActivity.class) Intent intent = newIntent(this,SecondActivity.class);   // Các data gửi kèm intent.putExtra("firstName",firstName); intent.putExtra("lastName", lastName); // yêu cầu start Activity chỉ định trong Intent. // (Không cần lời hồi đáp từ Activity được gọi) this.startActivity(intent); // yêu cầu start Activity và sẽ có lời hồi đáp từ Activity được gọi. this.startActivityForResult(intent, MY_REQUEST_CODE); Ví dụ cách truyền data qua Intent: // dùng Bundle cách 1. Intent mIntent2 = new Intent(this, SecondActivity.class); Bundle mBundle = new Bundle(); mBundle.putString("firstName", "firstName"); mBundle.putString("lastName", "lastName"); mIntent2.putExtras(mBundle); this.startActivity(intent,mBundle); // Cách 2: // dùng putExtra(), phương thức gọi tắt của Intent. Intent mIntent3 = newIntent(this, SecondActivity.class); mIntent3.putExtra("firstName", "firstName"); mIntent3.putExtra("lastName", "lastName"); this.startActivity(intent); Tại SecondActivity.class : Intent intent = this.getIntent(); String firstName= intent.getStringExtra("firstName"); String lastName = intent.getStringExtra("lastName"); // Hoặc nếu dùng Bundle cách 1 Bundle extras = this.getIntent(); String firstName1 = extras.getString("firstName"); String lastName2  = extras.getString("lastName"); Ta cũng có thể truyền Đối Tượng qua lại giữa các Activity, các đối tượng này phải được Serialize public class Note implements Serializable{
private String content;
private String title;
public Note(String title, String content) {
this.title = title;
this.content = content;
} @Override
public String toString() {
return title + “\n” + content;
} } //put Bundle mBundle = new Bundle(); Note n=new Note(“Diendanhocweb.com”,”Bai 5:Intent”); mBundle.putSerializable("n1",n); mIntent2.putExtras(mBundle); this.startActivity(intent,mBundle); //get Note n1=(Note) mBundle.getSerializable(“n1”);

Ví dụ với Intent tường minh

Tôi làm ví dụ sau để bạn dễ hiểu:

– Chương trình dễ làm là MainActivity sẽ có 1 Button và ListView như hình bên dưới:

– Khi nhấn “Mở Activity nhập data”, chương trình sẽ mở Activity mới dưới dạng Dialog:

– Khi nhập số và nhấn “Lưu bình phương” thì nó sẽ truyền số này qua MainActivity và update ListView với số này là nhân bình phương.

– Khi nhập số và nhấn “lưu số gốc” thì nó sẽ truyền số này qua MainActivity và update ListView với đúng số gốc này.

– Bạn quan tâm là phải đóng Dialog ngay, vì nếu không đóng thì onActivityResult sẽ không sảy ra. onActivityResult chỉ sảy ra trong foreground life time.

– Ta thực hiện khám phá app:

Source XML của activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:id="@+id/activity_main"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:paddingBottom="@dimen/activity_vertical_margin"      android:paddingLeft="@dimen/activity_horizontal_margin"      android:paddingRight="@dimen/activity_horizontal_margin"      android:paddingTop="@dimen/activity_vertical_margin"      android:orientation="vertical"      >        <Button          android:id="@+id/btn_open"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:text="Open input" />        <ListView          android:id="@+id/lvdata"          android:layout_width="match_parent"          android:layout_height="wrap_content" >      </ListView>    </LinearLayout>

Source XML của open_input.xml

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical"        >        <EditText          android:id="@+id/ed_input"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:hint="Input number"          android:inputType="number"          />        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:orientation="horizontal">            <Button              android:id="@+id/btn_binhphuong"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:text="Lưu bình phương"/>            <Button              android:id="@+id/btn_goc"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:text="Lưu giá trị gốc"/>      </LinearLayout>  </LinearLayout>    

– Code sử lý của MainActivity.java:

import android.content.Intent;  import android.os.Bundle;  import android.support.v7.app.AppCompatActivity;  import android.view.View;  import android.widget.ArrayAdapter;  import android.widget.Button;  import android.widget.ListView;    import java.util.ArrayList;    public class MainActivity extends AppCompatActivity {   public static final int REQUEST_CODE_INPUT=1;   public static final int RESULT_CODE_SAVE1=2;   public static final int RESULT_CODE_SAVE2=3;     Button btn_open;   ListView lvData;   ArrayAdapter<Integer> adapter=null;   ArrayList<Integer> arr=new ArrayList<>();   @Override   protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   btn_open=(Button)findViewById(R.id.btn_open);   btn_open.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View arg0) {   //open Activity with REQUEST_CODE_INPUT   Intent intent=new Intent(MainActivity.this, Open_input.class);   //call startActivityForResult   startActivityForResult(intent, REQUEST_CODE_INPUT);     }   });   lvData=(ListView)findViewById(R.id.lvdata);   adapter=new ArrayAdapter<Integer>   (this, android.R.layout.simple_list_item_1, arr);   lvData.setAdapter(adapter);     }   @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data) {   // TODO Auto-generated method stub   super.onActivityResult(requestCode, resultCode, data);     if(requestCode==REQUEST_CODE_INPUT)   {     switch(resultCode)   {   case RESULT_CODE_SAVE1:   //value from InputActivity   int v1= data.getIntExtra("data", 0);   arr.add(v1*v1);   adapter.notifyDataSetChanged();   break;   case RESULT_CODE_SAVE2:     int v2= data.getIntExtra("data", 0);   arr.add(v2);   adapter.notifyDataSetChanged();   break;   }   }   }    }    

quan tâm: ta nên khai báo hằng số cho RequestCode và ResultCode như ở trên, dựa vào nó để ta xử lý kết quả trả về – Code xử lý của Open_input.java

import android.content.Intent;  import android.os.Bundle;  import android.support.v7.app.AppCompatActivity;  import android.view.View;  import android.widget.Button;  import android.widget.EditText;    /**   * Created by VanCuong    */    public class Open_input extends AppCompatActivity {      Button btnSave1,btnSave2;      EditText editNumber;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.open_input);          btnSave1=(Button) findViewById(R.id.btn_binhphuong);          btnSave2=(Button) findViewById(R.id.btn_goc);          btnSave1.setOnClickListener(new View.OnClickListener() {                @Override              public void onClick(View arg0) {                  //saving square message                  sendToMain(MainActivity.RESULT_CODE_SAVE1);              }          });          editNumber=(EditText) findViewById(R.id.ed_input);          btnSave2.setOnClickListener(new View.OnClickListener() {                @Override              public void onClick(View v) {                  //saving itself message                  sendToMain(MainActivity.RESULT_CODE_SAVE2);              }          });      }      /**         * @param resultcode       */      public void sendToMain(int resultcode)      {          Intent intent=new Intent();            int value= Integer.parseInt(editNumber.getText()+"");          intent.putExtra("data", value);          setResult(resultcode, intent);          finish();      }  }    

– Bạn nhìn vào hàm sendToMain, khi hàm này vừa hoàn thành thì lập tập onActivityResult của MainActivity sẽ sảy ra

onActivityResult(int requestCode, int resultCode, Intent data)

Ta kiểm tra requestCode và resultCode cho đúng

requestCode là bên MainActivity dùng để triệu gọi một Activity bất kỳ nào đó

resultCode là kết quả trả về trong hàm setResult(resultcode, intent); của sub Activity nào đó. Hàm này cho ta biết kết quả trả về là code nào và đồng thời cho ta biết luôn Intent của nó. Dựa vào Intent này mà trong onActivityResult ta có thể rất dễ lấy thông số ra (đối số thứ 3).

 

-sau cùng là  AndroidManifest.xml

<application      android:allowBackup="true"      android:icon="@mipmap/ic_launcher"      android:label="@string/app_name"      android:supportsRtl="true"      android:theme="@style/AppTheme">      <activity android:name=".MainActivity">          <intent-filter>              <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />          </intent-filter>      </activity>      <activity android:name=".Open_input"          android:theme="@style/Theme.AppCompat.Dialog"></activity>  </application>    

quan tâm: Bạn phải để Activity Open_input dạng dialog nhé

<activity android:name=".Open_input"          android:theme="@style/Theme.AppCompat.Dialog"></activity>

Intent không tường minh

Intent không tường minh (Implicit Intents): Là những ý định (intent) không những định rõ một mục tiêu thành phần, nhưng bao gồm đầy đủ tin tức 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 app liệt kê các nhà hàng có sẵn ở gần bạn. Khi bạn bấm vào một option nhà hàng cụ thể, app sẽ hỏi một app khác để hiển thị các tuyến đường đến nhà hàng đó. Để đạt được điều này, nó hoặc có thể gửi một ý định rõ ràng trực tiếp đến các app Google Maps, hoặc gửi ý định ngầm, ý định sẽ được chuyển giao cho bất kỳ app nào cung ứng các chức năng bản đồ (map)  (chẳng hạn, Yahoo Maps).

Ví dụ dễ làm với Intent không tường minh

– Code activity_main.xml

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:app="http://schemas.android.com/apk/res-auto"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical"     >        <Button          android:id="@+id/btn_call"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:text="Call"          />      <Button          android:id="@+id/btn_web"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:text="google"          />  </LinearLayout>

– Code MainActivity.java

import android.Manifest;  import android.content.DialogInterface;  import android.content.Intent;  import android.content.pm.PackageManager;  import android.net.Uri;  import android.os.Bundle;  import android.support.v4.app.ActivityCompat;  import android.support.v7.app.AlertDialog;  import android.support.v7.app.AppCompatActivity;  import android.view.View;  import android.widget.Button;    public class MainActivity extends AppCompatActivity {        Button btn_call, btn_web;      AlertDialog.Builder builder;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          btn_call = (Button) findViewById(R.id.btn_call);          btn_web = (Button) findViewById(R.id.btn_web);              btn_call.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  dialog();              }          });          btn_web.setOnClickListener(new View.OnClickListener() {              @Override              public void onClick(View v) {                  web();              }          });      }      public void dialog(){          builder =new AlertDialog.Builder(this);          builder.setTitle("Dienhocweb.com");          builder.setMessage("Bạn có muốn gọi không?");          builder.setCancelable(false);          builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {              @Override              public void onClick(DialogInterface dialog, int which) {                  call();                  dialog.dismiss();              }          }).setNegativeButton("No", new DialogInterface.OnClickListener() {              @Override              public void onClick(DialogInterface dialog, int which) {                  dialog.cancel();              }          }).create();          builder.show();      }      public void call(){          String number = "900";          Intent intent = new Intent(Intent.ACTION_CALL);          intent.setData(Uri.parse("tel:" + number));          if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {              // TODO: Consider calling              //    ActivityCompat#requestPermissions              // here to request the missing permissions, and then overriding              //   public void onRequestPermissionsResult(int requestCode, String[] permissions,              //                                          int[] grantResults)              // to handle the case where the user grants the permission. See the documentation              // for ActivityCompat#requestPermissions for more details.              return;          }          startActivity(intent);      }      public void web(){          Uri url= Uri.parse("http://www.google.com");          Intent browserIntent = new Intent(Intent.ACTION_VIEW,url);          startActivity(browserIntent);      }  }

 

– sau cùng là  AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.diendanhocweb.myintent">        <uses-permission android:name="android.permission.CALL_PHONE" />      <uses-permission android:name="android.permission.INTERNET" />      <application          android:allowBackup="true"          android:icon="@mipmap/ic_launcher"          android:label="@string/app_name"          android:roundIcon="@mipmap/ic_launcher_round"          android:supportsRtl="true"          android:theme="@style/AppTheme">          <activity android:name=".MainActivity">              <intent-filter>                  <action android:name="android.intent.action.MAIN" />                    <category android:name="android.intent.category.LAUNCHER" />              </intent-filter>          </activity>      </application>    </manifest>

– một vài Action khác bạn có thể tham khảo thêm ở đây https://lập trình viêneloper.android.com/reference/android/content/Intent.html

– Sau khi chạy

Bạn đang đọc bài viết Bài 5: Intent trong Android  tại chuyên đề Lập trình Android cơ bản của diễn đàn học website.Mọi tin tức chia sẻ, lời hồi đáp xin gửi về hòm thư [email protected] hoặc comment xuống cuối bài nhé các bạn.

Chúc bạn thành công!

 

 

Nguồn diendanhocweb.com