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

 更新时间:2016年09月29日 08:42:18   投稿:daisy  
这篇文章给大家介绍了Android中Intent传递对象的3种方式,分别是Serializable 方式、Parcelable 方式以及JSON 方式,有需要的朋友们可以一起参考借鉴,下面来一起看看吧。

前言

相信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实现二级购物车的全选加反选、总价功能

    Android实现二级购物车的全选加反选、总价功能

    这篇文章主要为大家详细介绍了Android实现二级购物车的全选加反选、总价功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Android PopUpWindow实现卡片式弹窗

    Android PopUpWindow实现卡片式弹窗

    大家好,本篇文章主要讲的是Android PopUpWindow实现卡片式弹窗,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Android控件之ProgressBar用法实例分析

    Android控件之ProgressBar用法实例分析

    这篇文章主要介绍了Android控件之ProgressBar用法,以一个完整实例形式较为详细的分析了ProgressBar控件操作进度显示的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • flutter实现发送验证码功能

    flutter实现发送验证码功能

    这篇文章主要为大家详细介绍了flutter发送验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 详解Android中Notification通知提醒

    详解Android中Notification通知提醒

    这篇文章主要为大家介绍了Android中Notification通知提醒,本文演示了普通的通知和自定义视图通知
    2016-01-01
  • ViewModel中StateFlow和SharedFlow单元测试使用详解

    ViewModel中StateFlow和SharedFlow单元测试使用详解

    这篇文章主要为大家介绍了ViewModel中StateFlow和SharedFlow单元测试使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅谈Android编码规范及命名规范

    浅谈Android编码规范及命名规范

    本文主要总结一下Android项目的开发规范:1、编码规范 2、命名规范。有需要的朋友可以看下
    2016-12-12
  • android仿支付宝密码输入框效果

    android仿支付宝密码输入框效果

    这篇文章主要为大家详细介绍了android仿支付宝密码输入框效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 详解Flutter中的数据传递

    详解Flutter中的数据传递

    这篇文章主要介绍了Flutter中的数据传递的相关资料,帮助大家更好的理解和学习使用Flutter,感兴趣的朋友可以了解下
    2021-04-04
  • Kotlin this关键字的使用实例详解

    Kotlin this关键字的使用实例详解

    这篇文章主要介绍了Kotlin this关键字的使用实例,在Kotlin中,this关键字允许我们引用一个类的实例,该类的函数恰好正在运行。此外,还有其他方式可以使this表达式派上用场
    2023-02-02

最新评论