概述
可以直接使用startActivity(Intent intent)
方法從一個Activity跳轉至另一個Activity,但有時候需要Activity返回數據,例如:
Activity_A
開啓了Activity_B
,用戶在Activity_B
中進行一些操作後按下Back
鍵,Activity_B
返回到Activity_A
。在這一過程Activity_A
要求Activity_B
返回數據。
使用startActivity(Intent intent)
方法固然可以,但當Activity_A
要求多個其它Activity也返回數據時,使用startActivity(Intent intent)
方法就顯得繁瑣。
這種情況下使用startActivityForResult()
方法。
StartActivityForResult()
Intent intent=new Intent(this,TargetActivity.class);
intent.putExtra("hello","HelloWorld");
//launch TargetActivity
intent.startActivityForResult(intent,0);
參數解析
startActivityForResult()
在Activity.java
中的定義爲:
public void startActivityForResult(Intent intent,int requestCode)
Intent intent
這個參數是一個Intent
實例,用來Activity切換髮起方向目標方傳遞數據。
int requestCode
這個參數用來標識不同的子Activity返回的數據,當前Activity要求多個子Activity返回數據時,使用requestCode
來區分接收的數據是哪個Activity返回的。
onActivityResult()
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
//some statement
}
這個方法用來處理子Activity的返回,子Activity返回時,接收返回的Activity會直接進入此方法。因此,Activity要求子Activity返回數據,自身先要重寫此方法。
參數解析
onActivityResult()
在Activity.java
中的定義爲:
protected void onActivityResult(int requestCode,int resultCode,Intent data)
int requestCode
這個參數對應startActivityForResult(Intent intent,int requestCode)
方法中的requestCode
,即用來區分返回的數據來自於哪個子Activity。
int resultCode
這個參數用來區分一個子Activity返回的數據類型,對應下面將要討論的setResult(int resultCode,Intent intent)
方法中的resultCode
。因爲接收返回的Activity無法確定返回的是什麼類型的數據,可能是String
型,也可能是double
型…,使用resultCode
來約定指代返回數據的類型,然後使用不同的getXXXExtra()
方法來接收返回的數據。
Intent data
這個參數是一個包含有返回數據的Intent對象,使用data.getXXXExtra()
方法即可得到子Activity返回的數據。
提要
requestCode
用於區分不同子Activity的返回數據;resultCode
用於約定指代一個子Activity返回數據的類型。
完整的Activity切換髮起方代碼
CurrentActivity.java
import...
import java.io.Serializable;
public class CurrentActivity extends Activity
implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//load currentActivity.xml
setContentView(R.layout.currentActivity);
Button btn_1=(Button)findviewById(R.id.btn_1);
btn_1.setOnClickListener(this);
}
@Override
protected void onClick(View v) {
Person person=new Person();
Intent intent=new Intent(this,TargetActivity.class);
intent.putExtra("Lishaoyin",person);
startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
String str_Data;
double dbl_Data;
Person Pes_Data;
if(requestCode==0) {
if(resultCode==0) str_Data=data.getStringData("name");
else if(resultCode==1) dbl_Data=data.getDoubleData("name");
else if(resultCode==2) pes_Data=(Person)data.getSerializableExtra("name");
...
}
else if(requestCode==1)
...
}
}
Person.java
import...
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private float height;
public void setName(String name) {
this.name=name;
}
public void setHeight(float height) {
this.height=height;
}
public String getName() {
return name;
}
public float getHeight() {
return height;
}
}
setResult()
@Override
public void onBackPressed(){
Person person=new Person();
person.setName("Tony Stark");
person.setHeight(1.78);
Intent intent =new Intent(); //use Intent() without Param
intent.putExtra("Tony",person);
setResult(0,intent);
super.onBackPressed(); //back
}
以上代碼重寫了public void onBackPressed()
方法,用戶在按Back
鍵時系統會調用此方法。代碼中首先創建了Intent對象,用Intent對象發出數據,再使用setResult()
方法返回數據給切換Activity發起方。
注意不要使用Intent(Context packageContext, Class<?> cls)
版本去指定跳轉指向,也不要使用setClass()
指定,因爲Activity返回時跳轉指向是明確的,直接使用Intent intent=new Intent()
創建intent即可。
參數解析
setResult()
在Activity.java
中的定義爲:
public final void setResult(int resultCode,Intent data)
int resultCode
這個參數用於約定指代返回數據的類型,對應於上面討論的onActivityResult(int requestCode,int resultCode,Intent data)
方法中的resultCode
。
Intent data
這個參數即爲包含有返回數據的Intent對象。
完整的Activity切換接收方代碼
TargetActivity.java
import...
public class TargetActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//load targetActivity.xml
setContentView(R.layout.targetActivity);
}
@Override
public void onBackPressed(){
Person person=new Person();
person.setName("Tony Stark");
person.setHeight(1.78);
Intent intent=new Intent();
intent.putExtra("Tony",person);
setResult(0,intent);
super.onBackPressed();
}
}
歡迎指正