android activity 相互传值

传递单个简单类型的情况:

Main.activity

Pass value:

Intent intent = newIntent(MainActivity.this,SecondActivity.class);
intent.putExtra("Main","123");
startActivityForResult(intent, 0);

Get value from other activity

@Override
protectedvoid onActivityResult(int requestCode,int resultCode, Intent data) {
if (resultCode ==RESULT_OK)
{
Log.d("debug","result=" + data.getStringExtra("second"));
}
super.onActivityResult(requestCode, resultCode, data);
}


Test.activity

Get value:

Intent intent = getIntent();
final String num = intent.getStringExtra("Main");
Then pass value to main activity
Intent intent = newIntent();
intent.putExtra("second","This is Second Activity's value!");
setResult(RESULT_OK, intent);
finish();

传递多个简单类型的情况:

使用 Bundle打包的方式:

Pass value:

Home Activity:

Bundle bundle = new Bundle();

*字符、字符串、布尔、字节数组、浮点数等等,都可以传*/
bundle.putString("Name", "feng88724");
bundle.putBoolean("Ismale", true);

/*把bundle对象assign给Intent*/
intent.putExtras(bundle);


Get value:

Away Activity:

/*获取Intent中的Bundle对象*/
Bundle bundle = this.getIntent().getExtras();

*获取Bundle中的数据,注意类型和key*/
String name = bundle.getString("Name");
boolean ismale = bundle.getBoolean("Ismale");


传对象

有三种常用方法:

Serializable 方式

这是最简单的一种方法,因为我们要做的就是让我们自定义的对象实现 Serializable这个空接口。

public class Person implements Serializable{
        private String mName;
        private String mAddress;

        public String getName() {
            return mName;
     }

     public void setName(String name) {
             mName = name;
     }

        public String getAddress() {
             return mAddress;
        }

        public void setAddress(String address) {
             mAddress = address;
        }
}

构造了实现Serializable接口的对象模型之后,就借助Intent的putExtra方法将创建的Person对象传递出去

Person person = new Person();
            person.setName("Hwaphon");
            person.setAddress("Anhui");

            Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            intent.putExtra("person",person);
            startActivity(intent);
            finish();

接收数据的方法与上面使用Bundle类的类似:

Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");

使用Serializable方法虽然十分简单,但是效率却不容乐观,因为它会把整个对象序列化,开销十分大,为了追求效率,我们不得不使用另一种方法,也就是Parcelable 方法。

Parcelable 方式

自定义类实现Parcelable接口,必须重写两个方法

1.describeContents(): 用于描述内容接口,一般直接 return 0即可

2.writeToParcel() : 用于将想要传递的数据写入到Parcel容器中。

除了这两个方法以外,我们还需要创建一个 Parcelable.Creator接口的实现,这个接口中也需要我们实现两个方法

1.createFromParcel() : 用于将写入Parcel容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。

2.newArray() :创建一个长度为 size 的数组并且返回,一般而言,直接返回return T[size] 即可。

public class Person implements Parcelable{
        private String mName;
        private String mAddress;

        public String getName() {
            return mName;
     }

        public void setName(String name) {
            mName = name;
     }

        public String getAddress() {
             return mAddress;
        }

        public void setAddress(String address) {
            mAddress = address;
        }

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

        @Override
    public void writeToParcel(Parcel parcel, int i) {
            parcel.writeString(mName);
            parcel.writeString(mAddress);
        }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
            @Override
             public Person createFromParcel(Parcel parcel) {
                    Person person = new Person();
                    person.mName = parcel.readString();
                    person.mAddess = parcel.readString();
                    return person;
            }

            @Override
            public Person[] newArray(int i) {
                    return new Person[i];
            }
     };
}

接收数据对象的方法稍有不同

Intent intent = getIntent();
Person person = (Person) intent.getParcelableExtra("person");
注意1:在 writeToParcel()方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是 Parcelabel 方法比 Serializable方法高效的原因所在。
注意2:使用Parcelable接口实现按需读写,要求我们读数据的顺序必须要和写数据的顺序要一致,否则就会抛异常!
注意3:Parcelable接口显然比 Serializable 接口实现代码多,可以使用插件一键生成这些代码,比如说 Android Parcelable code generator 插件,可以直接在 Android Studio Plugins去下载该插件,下载完之后 点击 Alt+Insert就可以看到 Parcelable选项

JSON 方式

首先是依赖Gson库,但它不过是另一种序列化的方式而已,至于区别,就是数据类不需要实现任何的额外接口,代码看着很清晰明了
public class Person{
        private String mName;
        private String mAdress;

    public String getName() {
            return mName;
        }

        public void setName(String name) {
            mName = name;
        }

        public String getAdress() {
            return mAdress;
     }

        public void setAdress(String adress) {
            mAdress = adress;
        }
    }
传递数据的方式:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",new Gson().toJson(person));
接收数据的方式:
Intent intent = getIntent();
String JsonData = intent.getStringExtra("person");
Person person = new Gson().fromJson(JsonData,Person.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值