美文网首页四大组件之Activity程序员
Android中Activity之间的数据传递|Squirrel

Android中Activity之间的数据传递|Squirrel

作者: 跳动的松鼠 | 来源:发表于2017-11-08 08:16 被阅读8次

系列文章:
Activity的4种启动模式及使用场合|SquirrelNote
Android中Activity之间的数据传递|SquirrelNote
Android中启动Activity活动的另一种写法|SquirrelNote
基类Activity|SquirrelNote

在Android的Activity中,我们会经常进行数据的交互,本篇针对使用频繁的Activity与Activity几种数据传递方式进行了解和使用。

Activity四种基本常见的传递数据的方式

  1. Intent传递简单数据
  2. 使用Bundle传递数据包
  3. 传递值对象
  4. 获取Activity的返回参数

1.Intent传递简单数据

直接使用 intent.putExtra("name","姓名"),设置数据

Intent intent = new Intent(MainActivity.this,BActivity.class);
intent.putExtra("name", "孙悟空");
intent.putExtra("age", 22);
intent.putExtra("address", "Shenzhen");

BActivity中读取数据:

Intent intent = getIntent();
String nameString = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0);
String addressString = intent.getStringExtra("address");

2.使用Bundle传递数据包

Intent intent = new Intent(MainActivity.this,BActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "猪八戒");
bundle.putInt("age", 21);
bundle.putString("address", "China");
//将bundle传入intent中
intent.putExtras(bundle);     

BActivity中读取数据:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String nameString = bundle.getString("name");
int age = bundle.getInt("age");
String addressString = bundle.getString("address");

通过Bundle可以传递稍微复杂的数据

3.传递值对象

所谓的值对象,就是我们通常在项目中自定义的,有数据类型的。
那我们就先自定义一个数据类型

public class UserBean implements Serializable{

    private String name;
    private String age;

    public UserBean(String name, String age) {
        this.name = name;
        this.age = age;
    }


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

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

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }
}

在这里我们定义了两个都是String类型的参数,并且实现了Serializable接口。使我们的自定义数据类型进行数据序列化
在MainActivity中:

Intent intent = new Intent(MainActivity.this,BActivity.class);
intent.putExtra("UserBean",new UserBean("张三","24"));
startActivity(intent);

直接进行自定义对象的传递,并赋予两个参数
BActivity中:

UserBean userBean ;
userBean = (UserBean) getIntent().getSerializableExtra("UserBean");
tv.setText(userBean.getName() + "  " + userBean.getAge());

使用UserBean对象获取序列化后的对象并进行强制转换,并通过获取的对象,进行操作。

使用序列化很简单,方便的可以进行复杂,大量数据的传递,但是,Serializable与Parcelable相比而言 效率比较低 ,所以Android平台又给我们提供了Parcelable,他是一个专门针对移动工具上数据序列化的接口,那么,下面我们就来进行学习。
UserBean

public class UserBean implements Parcelable{

    private String name;
    private String age;

    public UserBean(String name, String age) {
        this.name = name;
        this.age = age;
    }


    protected UserBean(Parcel in) {
        name = in.readString();
        age = in.readString();
    }

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

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

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

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

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

    public static final Creator CREATOR = new Creator() {
        @Override
        public UserBean createFromParcel(Parcel in) {
            return new UserBean(in.readString(),in.readString());
        }

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

}

我们实现了Parcelable接口,并且实现了3个方法,
writeToParcel
这个方法中是需要我么去手动读取的,我们把我们要传递的变量保存,以供其他的成员变量或者组件使用,那么再来看如何获取,很简单

BActivity

UserBean userBean = getIntent().getParcelableExtra("UserBean");
tv.setText(userBean.getName() + "  " + userBean.getAge());

这时,我们依然成功的获取到了传递过来值。

区别:

Serializable和Parcelable都是序列化接口,因为Serializable简单,方便,Android系统对他有自动完成序列化的操作,所以速度是比较慢的。而Parcelable中都是手动去添加数据类型,读取数据,Android系统并没有给我们提供序列化机制,所以Parcelable的数据是相对复杂的,但是速度是比较快的。所以在使用时,注意优缺点选择。

4.获取Activity的返回参数

核心代码如下
MainActivity中

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       Intent intent = new Intent(MainActivity.this,BActivity.class);
       intent.putExtra("UserBean",new UserBean("张三","22"));
       startActivityForResult(intent,1);
    }
});

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

        if (resultCode == 1){
            if (requestCode == 1){
               // TODO 
               //做你需要做的操作
            }
        }

}

BActivity

UserBean userBean = getIntent().getParcelableExtra("UserBean");
tv.setText(userBean.getName() + "  " + userBean.getAge());

setResult(1);

以上是根据我的一些理解,做的总结分享,旨在抛砖引玉,希望有更多的志同道合的朋友一起讨论学习,共同进步!

参考文章:https://juejin.im/entry/5756976c6be3ff006b024e80

相关文章

网友评论

    本文标题:Android中Activity之间的数据传递|Squirrel

    本文链接:https://www.haomeiwen.com/subject/vcfemxtx.html