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();
    }
}

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