Android中Intent传递对象的3种方式详解
前言
相信Intent的用法大家已经比较熟悉了,Intent可以用来启动Activity,Service等等,同时我们也可以通过Intent来进行传递数据,当我们使用Intent在Activity间传递信息时发现putExtra()方法并不支持自定义对象的传输,下面就来介绍三种解决方式。
一、Serializable方式
这是最简单的一种方法,因为我们要做的就是让我们自定义的对象实现Serializable这个空接口。
publicclassPersonimplementsSerializable{ privateStringmName; privateStringmAddress; publicStringgetName(){ returnmName; } publicvoidsetName(Stringname){ mName=name; } publicStringgetAddress(){ returnmAddress; } publicvoidsetAddress(Stringaddress){ mAddress=address; } }
这个时候,就已经可以使用Intent的putExtra()方法传递这个自定义对象了,在Activity中这样使用
Personperson=newPerson(); person.setName("Hwaphon"); person.setAddress("Anhui"); Intentintent=newIntent(MainActivity.this,SecondActivity.class); intent.putExtra("person",person); startActivity(intent); finish();
在Activity中接收数据
Intentintent=getIntent(); Personperson=(Person)intent.getSerializableExtra("person");
使用Serializable方法虽然十分简单,但是效率却不容乐观,因为它会把整个对象序列化,开销十分大,为了追求效率,我们不得不使用另一种方法,也就是Parcelable方法。
二、Parcelable方式
令自定义类实现Parcelable接口,这个时候必须重写两个方法
1.describeContents():用于描述内容接口,一般直接return0即可
2.writeToParcel() :用于将想要传递的数据写入到Parcel容器中。
除了这两个方法以外,我们还需要创建一个Parcelable.Creator接口的实现,这个接口中也需要我们实现两个方法
1.createFromParcel():用于将写入Parcel容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。
2.newArray():创建一个长度为size的数组并且返回,一般而言,直接返回returnT[size]即可。
publicclassPersonimplementsParcelable{ privateStringmName; privateStringmAddress; publicStringgetName(){ returnmName; } publicvoidsetName(Stringname){ mName=name; } publicStringgetAddress(){ returnmAddress; } publicvoidsetAddress(Stringaddress){ mAddress=address; } @Override publicintdescribeContents(){ return0; } @Override publicvoidwriteToParcel(Parcelparcel,inti){ parcel.writeString(mName); parcel.writeString(mAddress); } publicstaticfinalParcelable.Creator<Person>CREATOR=newParcelable.Creator<Person>(){ @Override publicPersoncreateFromParcel(Parcelparcel){ Personperson=newPerson(); person.mName=parcel.readString(); person.mAddess=parcel.readString(); returnperson; } @Override publicPerson[]newArray(inti){ returnnewPerson[i]; } }; }
这个时候的接收方法与Serializable有点不同,如下
Intentintent=getIntent(); Personperson=(Person)intent.getParcelableExtra("person");
在writeToParcel()方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是Parcelabel方法比Serializable方法高效的原因所在。但是,这种方法比Serializable方法多了太多的实现代码了,有没有什么办法能改变这一现状呢?可以使用插件一键生成这些代码,比如说AndroidParcelablecodegenerator插件,可以直接在AndroidStudioPlugins去下载该插件,下载完之后点击Alt+Insert就可以看到Parcelable选项了。
三、JSON方式
这个时候自定义对象类为
publicclassPerson{ privateStringmName; privateStringmAdress; publicStringgetName(){ returnmName; } publicvoidsetName(Stringname){ mName=name; } publicStringgetAdress(){ returnmAdress; } publicvoidsetAdress(Stringadress){ mAdress=adress; } }
使用方式
//Send Intentintent=newIntent(MainActivity.this,SecondActivity.class); intent.putExtra("person",newGson().toJson(person)); //Receive Intentintent=getIntent(); StringJsonData=intent.getStringExtra("person"); Personperson=newGson().fromJson(JsonData,Person.class);
在使用时别忘了导入Gson包,否则是无法使用的。
总结
以上就是这篇文章的全部内容了,希望能对各位Android开发者们有所帮助,如果有疑问大家可以留言交流。