Activity返回数据

概述

 可以直接使用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();
    }
}

欢迎指正
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章