Android活动之间相互跳转并且返回数据的时候,需要使用Activity的startActivityForResult()方法。下面将有一个例子来详细讲述startActivityForResult()方法和一些注意事项。
例子:
1. activity_first.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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".FirstActivity" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:text="转到SecondActivity"
android:onClick="OnSecondClick"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/button"
android:onClick="OnThirdClick"
android:text="转到ThirdActivity" />
</RelativeLayout>
2. FirstActivity
package com.example.teststartactivityforresult;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class FirstActivity extends Activity {
public String message;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
}
public void OnSecondClick(View v){
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
startActivityForResult(intent,2);//转到SecondActivity
}
public void OnThirdClick(View v){
Intent intent = new Intent();
intent.setClass(this, ThirdActivity.class);
startActivityForResult(intent,3);//转到ThirdActivity
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case 2:
switch(resultCode){
case 0:
message = data.getStringExtra("return");
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
break;
case 1:
message = data.getStringExtra("return");
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
break;
}
break;
case 3:
switch(resultCode){
case RESULT_OK:
message = data.getStringExtra("return");
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
break;
}
}
}
3. activity_second.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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".SecondActivity" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:text="返回0到FirstActivity"
android:onClick="OnButtonClick"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button"
android:layout_below="@+id/button"
android:layout_marginTop="18dp"
android:onClick="OnButton2Click"
android:text="返回1到FirstActivity" />
</RelativeLayout>
4. SecondActivity
package com.example.teststartactivityforresult;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
public class SecondActivity extends Activity {
public Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
intent = this.getIntent();
}
public void OnButtonClick(View v){
intent.putExtra("return", "SecondActivity-0- 返回的内容");
setResult(0,intent);//回调FirstActivity
finish();//一定要结束该Activity 结束后返回到FirstActivity只执行onActivityResult方法
}
public void OnButton2Click(View v){
intent.putExtra("return", "SecondActivity-1-返回的内容");
setResult(1,intent);//回调FirstActivity
finish();//一定要结束该Activity 结束后返回到FirstActivity只执行onActivityResult方法
}
}
5. activity_third.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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ThirdActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
6. ThirdActivity
package com.example.teststartactivityforresult;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
public class ThirdActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Intent intent = this.getIntent();
intent.putExtra("return", "ThirdActivity返回的内容");
setResult(RESULT_OK,intent);
finish();
}
}
实现流程:
以FirstActivity和SecondActivity为例。
1. FirstActivity跳转到SecondActivity。
2. SecondActivity使用getIntent()方法,获得FirstActivity传过来的Intent对象。
3. SecondActivity将需要返回的数据封装在Intent对象中。
4. SecondActivity 使用serResult()方法将Intent对象返回。
5. SecondActivity finish()。
6. FirstActivity执行onActivityResult方法。
注意事项:
对根据上面的例子进行一下说明。
1. 一个Activity可以调用多个Activity并且返回数据,例如FirstActivity.
2. 被调用并且需要返回数据的Activity可以根据不同情况给予不同的返回数据,例如SecondActivity。
3. FirstActivity调用SecondActivity后需要返回FirstActivity的时候,SecondActivity必须执行finish(),返回到FirstActivity后只执行onActivityResult方法。
参考网址:
1.http://blog.csdn.net/conowen/article/details/7292246