本文介绍如何在Activity之间传递参数,该参数包括简单数据、包Bundle(提供2种方法,即有和无Bundle的两种方法)、值对象(提供2种方法,即Serializable和Parcelable的两种方法),最后介绍如何获取Activity的返回参数。以上所介绍的内容都提供了操作步骤和源码以便于大家交流与分享心得。

 

1、在Activity之间传递简单数据


(1)、新建Button

在activity_main.xml中加入如下代码:


<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btnStartAty"
    android:text="启动另一个Activity"/>



效果如下图:




activity与fragment数据传输 android android activity传递数据_移动开发



发现Button下面重叠着东西,这个东西就是activity_main.xml中原有的TextView,只需删除下面代码即可,

<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView" />


删除代码后的效果如下图:


activity与fragment数据传输 android android activity传递数据_android_02




(2)、新建Activity

直接在下图java文件夹下面直接新建即可。


activity与fragment数据传输 android android activity传递数据_User_03



新建的Activity命名为TheAty,Android Studio会自动在layout文件夹下生成activity_the_aty.xml,并且在AndroidManifest.xml中自动加入下面代码:

<activity
    android:name=".TheAty"
    android:label="@string/title_activity_the_aty" >
</activity>


接下来我们在activity_the_aty.xml中的TextView中设置一个id,即修改为如下代码:

<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:id="@+id/tv" />


即将id设置为tv。



(3)、在MainActivity.java中用Intent传递参数

在MainActivity.java中加入如下代码:

//用Intent传递参数
findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this,TheAty.class);
        i.putExtra("data","Activity send args");
        startActivity(i);
    }
});


(4)、在TheAty.java中用getIntent接收参数

将TheAty.java中的代码修改为:

public class TheAty extends AppCompatActivity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_aty);

        Intent i = getIntent();
        tv = (TextView) findViewById(R.id.tv);
        tv.setText(i.getStringExtra("data"));

    }


(5)、测试结果

测试结果如下图:


activity与fragment数据传输 android android activity传递数据_java_04



修改MainActivity.java中传递的参数为”Activity send args,Fred!”,测试结果如下图:


activity与fragment数据传输 android android activity传递数据_User_05





2、两种方法在Activity之间传递包Bundle


(1)、在MainActivity.java中传递包

在MainActivity.java中传递包,修改代码如下:

//传递简单数据
//                i.putExtra("data","Activity send args,Fred,Hello!");
//                startActivity(i);

                //传递包Bundle方法1
//                Bundle b = new Bundle();
//                b.putString("name","传递测试");
//                b.putInt("age",2);
//                b.putString("name1","Fred");
//                i.putExtras(b);
//                startActivity(i);

//                //传递包Bundle方法2
                Bundle b = new Bundle();
                b.putString("name","传递测试");
                b.putInt("age",2);
                b.putString("name1","Fred");
                i.putExtra("data",b);
                startActivity(i);




(2)、在TheAty.java中用Bundle接收参数

在TheAty.java中用Bundle接收参数,修改代码如下所示:

//获取简单数据
//        Intent i = getIntent();
//        tv = (TextView) findViewById(R.id.tv);
//        tv.setText(i.getStringExtra("data"));

        //获取包Bundle方法1
//        Intent i = getIntent();
//        tv = (TextView) findViewById(R.id.tv);
//        Bundle data = i.getExtras();
//        tv.setText(String.format("name=%s,age=%d,name1=%s",data.getString("name"),data.getInt("age"),data.getString("name1", "Fred")));

        //获取包Bundle方法2
        Intent i = getIntent();
        tv = (TextView) findViewById(R.id.tv);
        Bundle data = i.getBundleExtra("data");
        tv.setText(String.format("name=%s,age=%d,name1=%s",data.getString("name"),data.getInt("age"),data.getString("name1", "Fred")));


(3)、测试结果如下图


activity与fragment数据传输 android android activity传递数据_android_06




3、在Activity之间传递值对象


所谓的值对象,就是自定义的有数据类型的对象。

(1)、新建一个自定义的数据类型

新建一个自定义的数据类型User.java,其代码如下:

package edu.fred.hqu.androidactivitysendargs;

/**
 * Created by Fred on 2015/8/27.
 */
public class User {

    //成员
    private String name;
    private int age;

    //方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //添加构造方法
    public User(String name,int age){
        this.name = name;
        this.age =age;
    }
}


(2)、采用Serializable实现传递值对象

首先修改User.java,使之接口于Serializable,代码如下:

package edu.fred.hqu.androidactivitysendargs;

import java.io.Serializable;

/**
 * Created by Fred on 2015/8/27.
 */
public class User implements Serializable{

    //成员
    private String name;
    private int age;

    //方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //添加构造方法
    public User(String name,int age){
        this.name = name;
        this.age =age;
    }
}


其次修改MainActivity.java,加入要传递的值对象,代码如下:

//传递值对象方法1:Serializable
i.putExtra("user",new User("Fred",18));
startActivity(i);


接着修改TheAty.java,接收传递过来的值对象,代码如下:

//获取传递的值对象方法1
Intent i = getIntent();
tv = (TextView) findViewById(R.id.tv);
User user = (User) i.getSerializableExtra("user");
tv.setText(String.format("User info(name=%s,name=%d)",user.getName(),user.getAge()));


最后编译运行,给出实验结果如下图所示:


activity与fragment数据传输 android android activity传递数据_User_07




(3)、采用Parcelable实现传递值对象

首先修改User.java,使之接口于Parcelable,代码如下:

package edu.fred.hqu.androidactivitysendargs;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;

/**
 * Created by Fred on 2015/8/27.
 */
//public class User implements Serializable{
public class User implements Parcelable{
    //成员
    private String name;
    private int age;

    //方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //添加构造方法
    public User(String name,int age){
        this.name = name;
        this.age =age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeInt(getAge());
    }

    public static final  Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            //若是多个同类型的,可以采用source.writeBundle();实现
            return new User(source.readString(),source.readInt());
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

}


接着只需要修改TheAty.java,接收传递过来的值对象,代码如下:

//获取传递的值对象方法2
Intent i = getIntent();
tv = (TextView) findViewById(R.id.tv);
User user = i.getParcelableExtra("user");
tv.setText(String.format("User info(name=%s,name=%d)",user.getName(),user.getAge()));


最后编译运行,测试结果如下图所示:


activity与fragment数据传输 android android activity传递数据_android_08




(4)、值对象传递的两种方法Serializable和Parcelable的比较

Serializable操作简单,但是速度慢;

Parcelable是安卓平台提供的,操作复杂,但是效率高。



4、如何获取 Activity 的返回参数


如何获取 Activity 的返回参数,即如何获取被启动Activity 传回的参数。

(1)、在第二个Activity中加入按钮和待返回的参数

首先进入activity_the_aty.xml,将RelativeLayout换成LinearLayout(原因将在后续的博文中讲到),同时指明orientation为vertical,接着进入Design模式,拖入一个文本“Plain Text”和一个按钮“Button”,使得我们后面实现的功能是点击按钮,发送EditText中的数据到第一个Activity中去。示例代码如下:

<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="edu.fred.hqu.androidactivitysendargs.TheAty">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/tv"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Back"
        android:id="@+id/button" />

</LinearLayout>


(2)、在第一个Activity中加入一个“Plain TextView”,用于呈现返回参数的结果

首先进入activity_main.xml,将RelativeLayout换成LinearLayout(原因将在后续的博文中讲到),同时指明orientation为vertical,接着进入Design模式,拖进去一个“Plain TextView”,用于呈现结果,对应的示例代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnStartAty"
        android:text="启动另一个Activity" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textView"/>


</LinearLayout>


(3)、进入MainActivity.java中设置textView,并指定按钮动作,并显示出返回参数的数据,加入的代码如下:

private TextView textView;
textView = (TextView) findViewById(R.id.textView);


将startActivity(i);修改为startActivityForResult(i,0);,最后加入onActivityResult,完整的代码如下:

package edu.fred.hqu.androidactivitysendargs;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);

        //用Intent传递参数
        findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,TheAty.class);

               //传递简单数据
//                i.putExtra("data","Activity send args,Fred,Hello!");
//                startActivity(i);

                //传递包Bundle方法1
//                Bundle b = new Bundle();
//                b.putString("name","传递测试");
//                b.putInt("age",2);
//                b.putString("name1","Fred");
//                i.putExtras(b);
//                startActivity(i);

                //传递包Bundle方法2
//                Bundle b = new Bundle();
//                b.putString("name","传递测试");
//                b.putInt("age",2);
//                b.putString("name1","Fred");
//                i.putExtra("data",b);
//                startActivity(i);

                //传递值对象方法1:Serializable(简单但效率低)
//                i.putExtra("user",new User("Fred",18));
//                startActivity(i);

                //传递值对象方法2:Parcelable(复杂但高效)
                i.putExtra("user",new User("Fred",18));
//                startActivity(i);

                //获取Activity的返回参数
                startActivityForResult(i,0);

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        textView.setText("另一个Activity返回的数据是"+data.getStringExtra("data"));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


(4)、进入TheAty.java中设置功能为写入返回的参数数据(可编辑的),对应的代码如下:

public class TheAty extends AppCompatActivity {

    private TextView tv;
    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_aty);

        editText = (EditText) findViewById(R.id.editText);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.putExtra("data",editText.getText().toString());
                setResult(1,i);
                finish();
            }
        });


(5)、测试结果


activity与fragment数据传输 android android activity传递数据_android_09




点击“启动另一个Activity”后出现界面:


activity与fragment数据传输 android android activity传递数据_User_10




输入Fred:


activity与fragment数据传输 android android activity传递数据_User_11




点击send back,最后得到返回的数据如下图:


activity与fragment数据传输 android android activity传递数据_User_12



可以看出完全验证了我们的想法!!!!