当前位置: 移动技术网 > IT编程>移动开发>Android > Android中Intent传递对象的3种方式详解

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

孙茂业,格鲁克拉什,咎狗之血h

前言

相信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开发者们有所帮助,如果有疑问大家可以留言交流。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网