Contents
Intent là gì?
Intent (ý định) là những tin nhắn không đồng bộ cho phép các thành phần ứng dụng yêu cầu chức năng từ các thành phần Android khác. Intents cho phép bạn tương tác với các thành phần từ các ứng dụng như nhau cũng như với các thành phần đóng gói trong một ứng dụng 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ể định nghĩa một Intent sử 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 dữ liệu thông qua một Bundle. Dữ liệu này có thể được sử dụng bởi các thành phần tiếp nhận.
Intent có thể sử 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
// Tạo một Intent với mục tiêu là SecondActivity.class.
// Intent(FirstActivity, SecondActivity.class)
Intent intent =
new
Intent(
this
,SecondActivity.class
);
// Các dữ liệu 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 phản hồi từ Activity được gọi)
this
.startActivity(intent);
// Yêu cầu start Activity và sẽ có phản hồi từ Activity được gọi.
this
.startActivityForResult(intent, MY_REQUEST_CODE);
// Sử 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:
// Sử dụng putExtra(), phương thức gọi tắt của Intent.
Intent mIntent3 =
new
Intent(
this
, SecondActivity.class
);
mIntent3.putExtra(
"firstName"
,
"firstName"
);
mIntent3.putExtra(
"lastName"
,
"lastName"
);
this
.startActivity(intent);
Intent intent =
this
.getIntent();
String firstName= intent.getStringExtra(
"firstName"
);
String lastName = intent.getStringExtra(
"lastName"
);
// Hoặc nếu sử dụng Bundle cách 1
Bundle extras =
this
.getIntent();
String firstName1 = extras.getString(
"firstName"
);
String lastName2 = extras.getString(
"lastName"
);
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;
}}//putBundle mBundle =
new
Bundle();
Note n=new Note(“Diendanhocweb.com”,”Bai 5:Intent”);mBundle.putSerializable("n1",n)
;
mIntent2.putExtras(mBundle);
this
.startActivity(intent,mBundle);
//getNote 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 đơn giản là MainActivity sẽ có 1 Button và ListView như hình bên dưới:
– Khi nhấn “Mở Activity nhập dữ liệu”, 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à cập nhật 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à cập nhật ListView với đúng số gốc này.
– Bạn chú ý 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 tiến hành khám phá ứng dụng:
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; } } } }
Chú ý: Chúng ta nên khai báo hằng số cho RequestCode và ResultCode như ở trên, dựa vào nó để chúng 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 kết thúc 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 chúng 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ể dễ dàng lấy thông số ra (đối số thứ 3).
-Cuối 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>
Chú ý: 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 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ó hoặc 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 ý định ngầm, ý đị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).
Ví dụ đơn giản 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); } }
– Cuối 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 số Action khác bạn có thể tham khảo thêm ở đây https://developer.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 mục Lập trình Android cơ bản của Diễn đàn học website.Mọi thông tin chia sẻ, phản hồi xin gửi về hòm thư contact@diendanhocweb.com hoặc comment xuống cuối bài nhé các bạn.
Chúc bạn thành công!