Bài tập 24: Thực hành về Intent trong Android


– Các bạn đã đi qua được các thành phần giao diện  trong Android, bài tập này các bạn sẽ làm quen với Intent. Intent rất quan trọng nó là linh hồn của Android, là hạt nhân để Android tồn tại, hầu như mọi thứ trong Android đều có dấu ấn của Intent.

– Các bạn cần hiểu rõ Intent, Tôi sẽ đưa ra hàng loạt ví dụ từ dễ tới khó để các bạn có thể thẩm thấu nó từ từ.

– Đối với người bắt đầu tiếp cận Android thì Tôi có thể nói rằng các bạn chỉ dùng Intent để mở các Activity và truyển dữ liệu qua lại giữa chúng mà thôi. Khi đã nâng cao level thì bạn sẽ sử dụng Intent ở những mục đích khác nhau (Tôi sẽ có những ví dụ riêng về nó, nhưng trước tiên các bạn chỉ cần sử dụng tốt trong việc mở Activity và xử lý tác vụ này tốt là ok rồi).

– Vì lý do đó , để phù hợp với các bạn thì Tôi chia Intent ra làm 2 công dụng chính:

1) Dùng Intent để mở một Activity khác nhưng không kiểm soát kết quả trả về.

2) Dùng Intent để mở một Activity khác và có kiểm soát kết quả trả về.

Bây giờ chúng ta vào từng ví dụ cụ thể:

Ví dụ 1: Đơn thuần là mở một Activity khác.

24_intent_0– Tôi giải thích hình trên như sau: Từ Main Activity Tôi có 1 Button, khi nhấn vào Button này thì sẽ mở một Activity khác, tại Activity mới mở này sẽ có 1 Button cho phép quay trở lại MainActivity.

– Bạn phải nhớ lại vòng đời của một ứng dụng Android ở bài tập 5bài tập 6 để làm ví dụ này tốt hơn.

– Bạn tạo một Android Project có cấu trúc như hình bên dưới:

24_intent_1– Bạn chú ý là mọi Activity muốn được triệu gọi trong Android thì phải đăng ký trong Manifest, ở các bài tập trước Tôi cũng đã nói rồi, nhưng Tôi vẫn nhắc lại AndroidManifest.xml:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="tranduythanh.com"
 android:versionCode="1"
 android:versionName="1.0" >
 <uses-sdk
 android:minSdkVersion="14"
 android:targetSdkVersion="17" >
 </uses-sdk>
 <application
 android:allowBackup="true"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity
 android:name="tranduythanh.com.MainActivity"
 android:label="@string/app_name" >
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 <activity
 android:name="tranduythanh.com.ChildActivity"
 android:label="@string/title_activity_child" >
 </activity>
 </application>
</manifest>

– Bạn thấy đó cả MainActivity (dòng 16) và ChildActivity (Dòng 24)  đều phải được đăng ký trong Manifest.

– Giờ ta xem giao diện và cách xử lý coding trong MainActivity:

24_intent_2– Đây là cấu trúc XML của activity_main.xml ở trên:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >

<TextView
 android:id="@+id/textView1"
 android:layout_width="match_parent"
 android:layout_height="100dp"
 android:background="#008000"
 android:gravity="center"
 android:text="This is main Activity"
 android:textColor="#FFFF00"
 android:textSize="20sp"
 android:textStyle="bold" />

<Button
 android:id="@+id/btnOpenChildActivity"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:text="Open Child Activity" />

</LinearLayout>

– Tiến hành xem coding MainActivity.java:


package tranduythanh.com;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Button btnOpen=(Button)
 findViewById(R.id.btnOpenChildActivity);
 btnOpen.setOnClickListener(new
 View.OnClickListener() {
 public void onClick(View arg0) {
 doOpenChildActivity();
 }
 });
 }
 public void doOpenChildActivity()
 {
 Intent myIntent=new Intent(this, ChildActivity.class);
 startActivity(myIntent);
 }
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_main, menu);
 return true;
 }
}

– Quan sát dòng lệnh 25:

Intent myIntent=new Intent(this, ChildActivity.class);

Đối số 1 là context hiện tại, nếu bạn muốn chắc ăn ở đâu nó cũng hiểu thì bạn gán tên class Activity như thế này:

Intent myIntent=new Intent(MainActivity.thisChildActivity.class);

Với MainActivity là một Activity tùy ý (trong Context hiện tại), viết như trên thì bạn sẽ luôn luôn đúng trong mọi trường hợp.

Đối số 2 là :  ChildActivity.class, Tức là bạn muốn mở Activity nào thì lấy tên Activity đó .class; trong trường hợp này Tôi muốn mở ChildActivity nên Tôi ghi là ChildActivity.class

– Quan sát dòng lệnh 26
startActivity(myIntent); Hàm này có tác dụng mở Activity được truyền vào đối số thứ 2 ở trên.

– Tiến hành khám phá ChildActivity:

24_intent_3-Đầy là source XML của ChildActivity:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".ChildActivity" >

<TextView
 android:id="@+id/textView1"
 android:layout_width="match_parent"
 android:layout_height="100dp"
 android:background="#FFFF00"
 android:gravity="center"
 android:text="This is Child Activity"
 android:textColor="#008040"
 android:textSize="20sp"
 android:textStyle="bold" />

<Button
 android:id="@+id/btnBacktoMainActivity"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:text="Back to Main Activity" />

</LinearLayout>

-Giao diện của ChildActivity chỉ có một Button cho phép quay lại MainActivity.

– Bạn xem coding của ChildActivity:


package tranduythanh.com;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class ChildActivity extends Activity {
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_child);
 Button btnBack= (Button)
 findViewById(R.id.btnBacktoMainActivity);
 btnBack.setOnClickListener(new
 View.OnClickListener() {
 public void onClick(View v) {
 finish();
 }
 });
 }
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_child, menu);
 return true;
 }
}

-Dòng lệnh 18:  finish() có nhiệm vụ đóng Activity hiện tại.

– Bạn vừa đi qua 1 ví dụ vô cùng đơn giản.

– Tải coding ở đây:http://www.mediafire.com/?awoq5mkffm00qes

———————————————————————————-

Ví dụ 2: Mở một Activity khác đồng thời truyền dữ liệu qua.

– Bạn xem hình Tôi minh họa dưới này:

24_intent_4– Ở đây Ta thường dùng đối tượng Bundle để đóng gói dữ liệu để truyền tải qua các Activity khác.

– Tại sao lại nên dùng Bundle để truyền tải dữ liệu qua lại giữa các Activity?

+ Tối lấy ví dụ sau: Giả sử bạn phải chuyển toàn bộ hàng hóa từ Việt Nam sang Singapore, trường hợp này Ta sẽ bỏ tất cả các hàng hóa vào trong 1 Container rồi chuyển Container này đi, Không phải chuyển từng món hàng 1 qua Singapore. Tương tự như vậy, đối với Android khi truyền dữ liệu chúng ta cũng có thể truyền từng thông số riêng lẻ nhưng chúng ta không nên, chúng ta phải bỏ tất cả các dữ liệu riêng lẻ đó vào 1 Bundle rồi gửi Bundle này qua Activity nào đó. Bên kia chỉ cần lấy Bundle này ra, mọi dữ liệu đều nằm trong Bundle và ta dễ dàng xử lý.

24_intent_5– Bundle có 2 loại phương thức: putXXX dùng để cho bên gửi đi, ứng với kiểu dữ liệu nào thì put đúng kiểu đó. ở ví dụ trên putInt và putDouble là tương ứng với 2 loại dữ liệu khác nhau (phải đi kèm với key để bên nhận có thể xử lý đúng)

– Ở bên nhận Bundle thì dùng các phương thức getXXX tương ứng để lấy dữ liệu theo key bên gửi.

– key này phải giống nhau cho cả 2 nơi. Nơi nhận đặt key=soa thì bên nhận cũng phải dùng key=soa.

– 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

24_intent_6– Trong trường hợp truyền đối tượng thì ta dùng putSerializable getSerializable

– Tôi sẽ làm một ví dụ đơn giản với giao diện như bên dưới:

24_intent_7– Từ MainActivity có 2 thông số là a và b. Khi nhấn nút Kết quả nó sẽ truyền 2 thông số này qua ResultActivity và tiến hành giải phương trình bậc 1. Muốn trở về để tiếp tục giải phương trình khác khi nhấn nút Back.

– Bạn xem cấu trúc chương trình để dễ xử lý:

24_intent_8– Bạn xem giao diện của MainActivity (activity_main.xml):

24_intent_9– Đây là Source XML của MainActivity:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >
 <TextView
 android:id="@+id/textView1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:background="#008040"
 android:gravity="center"
 android:text="Giải phương trình bậc 1"
 android:textColor="#FFFF00" />
 <TableLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:stretchColumns="*"
 >
 <TableRow
 android:id="@+id/tableRow1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
 <TextView
 android:id="@+id/textView2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="#E5E5E5"
 android:text="Nhập a:" />
 <EditText
 android:id="@+id/txta"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:inputType="text"
 android:ems="10" >
 <requestFocus />
 </EditText>
 </TableRow>
 <TableRow
 android:id="@+id/tableRow2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >
 <TextView
 android:id="@+id/textView3"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="#E5E5E5"
 android:text="Nhập b:" />
 <EditText
 android:id="@+id/txtb"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:inputType="text"
 android:ems="10" />
 </TableRow>
 <TableRow
 android:id="@+id/tableRow3"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 >
 <Button
 android:id="@+id/btnketqua"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_column="1"
 android:text="Kết quả" />
 </TableRow>
 </TableLayout>
</LinearLayout>

– Trong xml layout Bạn có thể chọn layout nào cũng được, ở trên Tôi dùng TableLayout

– Tiến hành xem coding của MainActivity.java:


package tranduythanh.com;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
 EditText txta,txtb;
 Button btnketqua;
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 txta=(EditText) findViewById(R.id.txta);
 txtb=(EditText) findViewById(R.id.txtb);
 btnketqua=(Button) findViewById(R.id.btnketqua);
 btnketqua.setOnClickListener(new View.OnClickListener() {
 public void onClick(View arg0) {
 //Tạo Intent để mở ResultActivity
 Intent myIntent=new Intent(MainActivity.this, ResultActivity.class);
 //Khai báo Bundle
 Bundle bundle=new Bundle();
 int a=Integer.parseInt(txta.getText().toString());
 int b=Integer.parseInt(txtb.getText().toString());
 //đưa dữ liệu riêng lẻ vào Bundle
 bundle.putInt("soa", a);
 bundle.putInt("sob", b);
 //Đưa Bundle vào Intent
 myIntent.putExtra("MyPackage", bundle);
 //Mở Activity ResultActivity
 startActivity(myIntent);
 }
 });
 }
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_main, menu);
 return true;
 }
}

– Tôi đã giải thích mã lệnh trong đoạn code ở trên rồi.

– Ở dòng 31, key nhận dạng Bundle là MyPackage, bên ResultActivity sẽ dựa vào key này để lấy Bundle ra.

– Sau khi có Bundle rồi thì dựa vào soa, sob ở dòng lệnh 28,29 để lấy đúng dữ liệu.

– Bây giờ ta qua giao diện ResultActivity:

24_intent_10– Bạn xem XML Resource của ResultActivity:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".ResultActivity" >

<TextView
 android:id="@+id/textView1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:gravity="center"
 android:text="Kết quả giải phương trình bậc 1" />

<TextView
 android:id="@+id/txtketqua"
 android:layout_width="match_parent"
 android:layout_height="50sp"
 android:gravity="center"
 android:background="#CCFFD9"
 />

<Button
 android:id="@+id/btnBack"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:text="Back" />

</LinearLayout>

– Tiếp tục xem xử lý coding của ResultActivity:


package tranduythanh.com;

import java.text.DecimalFormat;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ResultActivity extends Activity {
 TextView txtketqua;
 Button btnBack;
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_result);
 btnBack=(Button) findViewById(R.id.btnBack);
 txtketqua=(TextView) findViewById(R.id.txtketqua);
 //lấy intent gọi Activity này
 Intent callerIntent=getIntent();
 //có intent rồi thì lấy Bundle dựa vào MyPackage
 Bundle packageFromCaller=
 callerIntent.getBundleExtra("MyPackage");
 //Có Bundle rồi thì lấy các thông số dựa vào soa, sob
 int a=packageFromCaller.getInt("soa");
 int b=packageFromCaller.getInt("sob");
 //tiến hành xử lý
 giaipt(a, b);
 btnBack.setOnClickListener(new View.OnClickListener() {
 public void onClick(View v) {
 finish();
 }
 });
 }
 public void giaipt(int a,int b)
 {
 String kq="";
 if(a==0 && b==0)
 {
 kq="Vô số nghiệm";
 }
 else if(a==0 && b!=0)
 {
 kq="Vô nghiệm";
 }
 else
 {
 DecimalFormat dcf=new DecimalFormat("0.##");
 kq=dcf.format(-b*1.0/a);
 }
 txtketqua.setText(kq);
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_result, menu);
 return true;
 }
}

-Bạn xem dòng lệnh 22: Intent callerIntent=getIntent(); lệnh này cho phép lấy Intent start Activity này. Tức là lấy Intent mà ta khai báo bên MainActivity để start ResultActivity.

– Có được Intent này rồi thì mọi thứ bạn làm như  Tôi giải thích trong Coding ở trên.

– Bạn có thể tải coding mẫu ở đây:http://www.mediafire.com/?vb8ddcoos7dupv7

———————————————————————————-

Ví dụ 3: Mở một Activity khác đồng thời truyền dữ liệu qua và xử lý kết quả trả về.

– Ví dụ này bạn sẽ biết cách xử lý kết quả trả về như thế nào.

– Bạn xem hình minh họa:

24_intent_11– Chúng ta sẽ dựa vào requestCodeID và resultCode để xử lý.

– Việc tạo Intent trong trường hợp này cũng y xì như trường hợp trước. Nó chỉ khác hàm gọi :

24_intent_12– Và phải thêm hàm xử lý kết quả trả về:

24_intent_13– 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:

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

24_intent_15– 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:

– Xem cấu trúc chương trình:

24_intent_16– Source XML của Mainactivity:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity" >

<Button
 android:id="@+id/btnopenactivity"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Mở Activity Nhập Dữ Liệu" />

<ListView
 android:id="@+id/lvdata"
 android:layout_width="match_parent"
 android:layout_height="wrap_content" >
 </ListView>

</LinearLayout>

– Source XML của activity_input_data.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/LinearLayout1"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".InputDataActivity" >

<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content" >

<TextView
 android:id="@+id/textView1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Nhập số:" />

<EditText
 android:id="@+id/editNumber"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:ems="10" >

<requestFocus />
 </EditText>

</LinearLayout>

<LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content" >

<Button
 android:id="@+id/btnSave1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:text="Lưu Bình Phương" />

<Button
 android:id="@+id/btnSave2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1"
 android:text="Lưu Số gốc" />

</LinearLayout>

</LinearLayout>

– Nhớ là phải cấu hình InputDataActivity dưới dạng Dialog: Mở Manifest để cấu hình như hình bên dưới:

24_intent_17– chọn Theme: @android:style/Theme.Holo.Dialog

-Tại màn hình trên ta chọn đúng Activity muốn làm Dialog rồi tìm tới thuộc tính Theme, nhấn vào nút “Browse”…:

24_intent_18-Bây giờ bạn xem xử lý code của MainActivity.java:


package tranduythanh.com;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {

public static final int REQUEST_CODE_INPUT=113;
 public static final int RESULT_CODE_SAVE1=115;
 public static final int RESULT_CODE_SAVE2=116;
 Button btnInputData;
 ListView lvData;
 ArrayList<Integer>arrData=new ArrayList<Integer>();
 ArrayAdapter<Integer>adapter=null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 btnInputData =(Button) findViewById(R.id.btnopenactivity);
 btnInputData.setOnClickListener(new OnClickListener() {

@Override
 public void onClick(View arg0) {
 //Mở Activity với REQUEST_CODE_INPUT
 Intent intent=new Intent(MainActivity.this, InputDataActivity.class);
 //gọi startActivityForResult
 startActivityForResult(intent, REQUEST_CODE_INPUT);
 }
 });
 //đoạn code dưới này học nhiều rồi, ko nói lại
 lvData=(ListView) findViewById(R.id.lvdata);
 adapter=new ArrayAdapter<Integer>
 (this,
 android.R.layout.simple_list_item_1,
 arrData);
 lvData.setAdapter(adapter);
 }
 /**
 * Xử lý kết quả trả về ở đây
 */
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 // TODO Auto-generated method stub
 super.onActivityResult(requestCode, resultCode, data);
 //Kiểm tra có đúng requestCode =REQUEST_CODE_INPUT hay không
 //Vì ta có thể mở Activity với những RequestCode khác nhau
 if(requestCode==REQUEST_CODE_INPUT)
 {
 //Kiểm trả ResultCode trả về, cái này ở bên InputDataActivity truyền về
 //có nó rồi thì xử lý trở lên thông thường
 switch(resultCode)
 {
 case RESULT_CODE_SAVE1:
 //giá trị từ InputDataActivity
 int v1= data.getIntExtra("data", 0);
 arrData.add(v1*v1);
 adapter.notifyDataSetChanged();
 break;
 case RESULT_CODE_SAVE2:
 //giá trị từ InputDataActivity
 int v2= data.getIntExtra("data", 0);
 arrData.add(v2);
 adapter.notifyDataSetChanged();
 break;
 }
 }
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_main, menu);
 return true;
 }

}

– 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ề.

– Bạn qua xử lý code của InputDataActivity.java:


package tranduythanh.com;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class InputDataActivity extends Activity {

Button btnSave1,btnSave2;
 EditText editNumber;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_input_data);
 btnSave1=(Button) findViewById(R.id.btnSave1);
 btnSave2=(Button) findViewById(R.id.btnSave2);
 btnSave1.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View arg0) {
 //Gửi thông điệp là lưu bình phương
 sendToMain(MainActivity.RESULT_CODE_SAVE1);
 }
 });
 editNumber=(EditText) findViewById(R.id.editNumber);
 btnSave2.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View v) {
 //Gửi thông điệp là lưu số gốc
 sendToMain(MainActivity.RESULT_CODE_SAVE2);
 }
 });
 }
 /**
 * hàm xử lý gửi kết quả về mainactivity
 * khi hàm này được gọi thì lập tức onActivityResult
 * ở MainActivity sẽ sảy ra đem theo ResultCode và Intent
 * @param resultcode
 */
 public void sendToMain(int resultcode)
 {
 Intent intent=getIntent();
 int value= Integer.parseInt(editNumber.getText()+"");
 intent.putExtra("data", value);
 setResult(resultcode, intent);
 finish();
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.activity_input_data, menu);
 return true;
 }

}

– 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).

– Như vậy bạn đã biết sơ qua về Intent, bạn phải lại đi làm lại 3 ví dụ của Tôi vừa nêu ra bên trên.

– Trong bài tập tiếp theo, Tôi sẽ củng cố kiến thức Intent cho bạn bằng một ví dụ cụ thể đầy đủ và hơi khó về Intent, bạn hãy chú ý theo dõi.

– Bạn có thể tải code mẫu đầy đủ ở đây: http://www.mediafire.com/?d8if4q9asgso18q

Chúc các bạn thành công.

44 responses

  1. Bài viết rất hay và dễ hiểu! Cảm ơn tác giả đã viết.

  2. mới đọc vào thấy rối nùi, 1 lác mới hiểu hihi…

  3. Híc híc. Chắc mình học dốt quá. Ko có gốc java giờ không biết làm thế nào

    1. chỉ có làm biếng chứ ko có dốt

      1. câu nói hay ^^!

      2. Chuẩn thế

    2. Lê Xuân Đoàn | Reply

      có ai giỏi java ngay từ đầu đâu bạn,theo như nhận xét của nhiều ng thì java là ng2 khá dễ học,chúc bạn sẽ học đc =))

  4. We have decided to open our POWERFUL and PRIVATE web traffic system to the public for a limited time! You can sign up for our UP SCALE network with a free trial as we get started with the public’s orders. Imagine how your bank account will look when your website gets the traffic it deserves. Visit us today: http://voxseo.com/traffic/

  5. thầy ơi ! giờ e muốn đóng gói dữ liệu kiểu imageview, spinner từ activity này, sau khi click vào button hiển thị trên activity kia thì khai báo và put vào bundle thế nào ạ ! Em cảm ơn thầy !

    1. theo mình nghĩ thì ta chỉ cần chuyển cái resource sang thôi rồi bên kia sét resource cho imageView. đấy là ý tưởng thôi nhé 😀

  6. […] Ở bài tập 24 và bài tập 25 Tôi đã hướng dẫn rất kỹ về cách sử dụng Intent (các intent […]

  7. Wow, awesome blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is magnificent, let alone the content!. Thanks For Your article about Bài tập 24: Thực hành về Intent trong Android | Dong Nai University of Technology .

    1. Thanks Baju Bayi
      I wrote this blog about 3 years ago.
      Thank you for viewing my site

  8. Thưa thầy,
    Ở ví dụ 2, nếu ta gửi X dữ liệu đến Activity 2, ở đây em ví dụ là 2 dữ liệu đến activity 2 thì có khác gì nếu không sử dụng Bundle ?
    Cách 1:
    //Gửi
    Bundle bundle=new Bundle();
    int a=Integer.parseInt(txta.getText().toString());
    int b=Integer.parseInt(txtb.getText().toString());
    bundle.putInt(“soa”, a);
    bundle.putInt(“sob”, b);
    myIntent.putExtra(“MyPackage”, bundle);
    startActivity(myIntent);

    //Nhận
    Intent callerIntent=getIntent();
    //có intent rồi thì lấy Bundle dựa vào MyPackage
    Bundle packageFromCaller=
    callerIntent.getBundleExtra(“MyPackage”);
    //Có Bundle rồi thì lấy các thông số dựa vào soa, sob
    int a=packageFromCaller.getInt(“soa”);
    int b=packageFromCaller.getInt(“sob”);
    //tiến hành xử lý
    int c = a + b;
    txtKetQua.setText(c + “”);

    Cách 2:

    //Gửi

    Intent t = new Intent(MainActivity.this, SubActivity.class);
    t.putExtra(“soa”, txta.getText().toString());
    t.putExtra(“soa”, txtb.getText().toString());
    startActivity(t);

    //Nhận

    int iA = Integer.valueOf(getIntent().getStringExtra(“soa”));
    int iB = Integer.valueOf(getIntent().getStringExtra(“sob”));

    //xử lý
    int c = a + b;
    txtKetQua.setText(c + “”);

    Nếu chưa nói đến việc truyền đối tượng mà chỉ đơn giản gửi dữ liệu đơn như trên thì cách 2 gọn hơn nhưng nó có ưu khuyết gì so với dung Bundle (cách 1) không thầy ?

    1. Lê Xuân Đoàn | Reply

      1,Theo mình thì cách gửi của bạn ( cách 2) là gửi riêng lẻ từng dữ liệu,còn cách thầy là cho hết dữ liệu vào Bundle r gửi bundle.Cách nhận của bạn thực chất vẫn là dùng Bundle vì trong câu lệnh int iA = Integer.valueOf(getIntent().getStringExtra(“soa”)); thì
      getIntent().getStringExtra(“soa”) bản chất nó là bundle r,ta có thể khai báo bundle theo cách Bundle bundle =getIntent().getExtra();..
      2.Cách làm của bạn có thể ngắn hơn về câu lệnh nhưng xét vs bài code dài và phức tạp thì cách của thầy hay hơn.Vd bạn gửi 100 gói hàng từ VN sang Nhật,khi nhận bạn fai soát từng thứ 1 và kiểm tra xem có thiếu gói hàng nào k,còn cách thầy thì cho hết 100 gói hàng vào 1 lô hàng,khi nhận thì chỉ cần nhận duy nhất 1 lô hàng là yên tâm k bị sót 1 gói hàng nào

  9. Thank you for the conscious analysis. Me and my national were immediately preparing to do a little examination by this. We got a grab a book starting our restricted documentation except I imagine I cultured added from this post. I am very pleased to comprehend such fantastic in sequence being mutual unreservedly absent there.

  10. I just want to say I am new to blogging and truly liked your blog. Likely I’m going to bookmark your blog post . You absolutely have superb article content. Thanks a bunch for revealing your blog.

  11. Cảm ơn bài viết pạn nhiều. Rất dễ hiểu và chi tiết

  12. Về ví dụ đầu tiên, cho em hỏi chút thầy. Em cũng không biết gì nhiều code, mong thầy bỏ qua nếu em có sai sót.
    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
    Ở đây chỉ về menu. activity_main… Nhưng trong ví dụ em ko thấy có. Chỉ có activity_mian trong layout

    1. Xem lại bài 22 đi bạn! Ở đây sử dụng file xml trong thư mục menu chứ không phải thư mục layout bạn nhé!

    2. Đây là code tự phát sinh ra tương ứng với Theme đã chọn thôi, nó không liên quan gì đến bài học. Bạn không cần phải lưu tâm.

  13. Mình muốn truyền 1 mảng từ listview thì sao mọi người..?

  14. […]  Intent intent=getIntent();  int value= Integer.parseInt(editNumber.getText()+"");  intent.putExtra("data", value);  setResult(resultcode, intent); Tham khảo thêm ở đây : https://duythanhcse.wordpress.com/2013/04/19/bai-tap-24-thuc-hanh-ve-intent-trong-android/ […]

  15. em cám ơn thầy ạ. Rất bổ ích đối với em

  16. Reblogged this on Flat World and commented:
    reblog

  17. thầy cho em hỏi. giả sử em có một biến có giá trị x = 3. em xét điều kiện khi nào x = 0 thì sẽ start Activity. vậy có cách nào để start activity mà không thông qua event không.

    1. if(x==0){
      Intent myIntent=new Intent(MainActivity.this, ResultActivity.class);
      startActivity(myIntent)
      }

  18. Thank you very much!

  19. […] Ở bài tập 24 và bài tập 25 Tôi đã hướng dẫn rất kỹ về cách sử dụng Intent (các intent […]

  20. Tấn Cường | Reply

    rất hay và bổ ích cho những người mới khám phá về android như em,cám ơn thầy ^^

  21. cảm ơn thầy

  22. ai giai thích giùm mình đoạn này với

    Bundle packageFromCaller=
    callerIntent.getBundleExtra(“MyPackage”);

    1. nói cho dễ hiểu là thế này nhé. Muốn lấy đc các giá trị trong bundle thì bạn phải có bundle, mà muốn có bundle thì phải có intent, muốn có intent thì phải new ra intent. Code trên nghĩa là bạn đang tạo một bundle có tên packageFromCaller và bundle này được tạo ra bằng cách lấy Intent có tên callerIntent và gọi phương thức .getBundleExtra(” bla bla bla”) để lấy ra Bundle mà bạn đã gửi trong myIntent ở trên

  23. thầy cho em hỏi là tại sao ví dụ 3 lại không sử dụng bundle để truyền giá trị nhập vào mà thầy lại dùng hàm putExtra và getIntExtra() ạ?

    1. Dùng bundle hay không cũng được, theo mình hiểu nếu dữ liệu ít (khoảng vài biến, dễ kiểm soát) thì ko cần dùng bundle cũng được, ngược lại nếu dữ liệu nhiều (hơn trăm biến chẳng hạn) nên dùng bundle để tránh sai sót.

  24. trong phần 3 dưới cái activity_input_data.xml,có câu
    “– Nhớ là phải cấu hình InputDataActivity dưới dạng Dialog: Mở Manifest để cấu hình như hình bên dưới:” ???
    Cho hỏi bật cái hộp thoại này ở đâu vậy.Vì e chỉ thấy có file mainfest.xml thôi.Em đang sử dụng android studio

  25. Hoàng Mạnh Hùng | Reply

    Cảm ơn bài giảng của thầy. Thầy cho em hỏi làm sao có thể truyển một danh sách các đối tưởng qua Intent ạ ví dụ như ArrayList listBook. Em cảm ơn thầy ạ.

  26. Nguyễn Duy Phong | Reply

    Bài viết rất hay. Em chúc thầy sức khỏe để làm thêm được nhiều bài nữa. Em cảm ơn!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s