Android中Intent传递对象的3种方式详解

Android中Intent传递对象的3种方式详解,第1张

概述前言相信Intent的用法大家已经比较熟悉了,Intent可以用来启动Activity,Service等等,同时我们也可以通过Intent来进行传递数据,当我们使用Intent在Activity间传递信息时发现putExtra()方法并不支持自定义对象的传

前言

相信Intent的用法大家已经比较熟悉了,Intent可以用来启动Activity,Service等等,同时我们也可以通过Intent来进行传递数据,当我们使用Intent在Activity 间传递信息时发现putExtra() 方法并不支持自定义对象的传输,下面就来介绍三种解决方式

一、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;    }}

这个时候,就已经可以使用Intent 的putExtra() 方法传递这个自定义对象了,在Activity中这样使用

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

在Activity中接收数据

 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];      }    };}

这个时候的接收方法与Serializable有点不同,如下

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

writetoParcel()方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是Parcelabel 方法比 Serializable方法高效的原因所在。但是,这种方法比Serializable 方法多了太多的实现代码了,有没有什么办法能改变这一现状呢?可以使用插件一键生成这些代码,比如说 AndroID Parcelable code generator 插件,可以直接在AndroID Studio Plugins去下载该插件,下载完之后 点击 Alt+Insert就可以看到Parcelable选项了。

三、JsON 方式

这个时候自定义对象类为

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

使用方式

 //Send Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("person",new Gson().toJson(person));// Receive Intent intent = getIntent(); String JsonData = intent.getStringExtra("person"); Person person = new Gson().fromJson(JsonData,Person.class);

在使用时别忘了导入Gson 包,否则是无法使用的。

总结

以上就是这篇文章的全部内容了,希望能对各位AndroID开发者们有所帮助,如果有疑问大家可以留言交流。

总结

以上是内存溢出为你收集整理的Android中Intent传递对象的3种方式详解全部内容,希望文章能够帮你解决Android中Intent传递对象的3种方式详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148068.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存