Intent传递对象的两种方法

Android为intent提供了两种传递对象参数类型的方法

分别需要使实体类实现Serializable接口、Parcelable接口

首先我们要知道,传递对象,需要先将对象序列化

一、那么为什么要对象序列化

 1、永久性保存对象,保存对象的字节序列到本地文件中;

 2、用过序列化对象在网络中、进程间传递对象;

二、序列化对象什么时候实现Serializable接口,什么时候实现Parcelable接口接口

1、Parcelable不能使用将数据存储在磁盘上,因为Parcelable在外界有变化的情况下不能很好的保存数据的持续性。

   因此在这种情况下,建议使用Serializable

2、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。

     并且Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

----------------------------------------------------------------------------------------------------------

下面看下两种传递对象方式的使用方法

一、实体类继承Serializable接口的方式

1、第一步,将我们需要传送的对象所属的实体类实现Serializable接口

 1 package com.xqx.IntentDemo;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * People实体类,含有 name,sex,age三个属性  ,并实现类的封装
 7  */
 8 public class People implements Serializable {
 9     private String name;
10     private String sex;
11     private int age;
12 
13     public String getName() {
14         return name;
15     }
16 
17     public String getSex() {
18         return sex;
19     }
20 
21     public int getAge() {
22         return age;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     public void setSex(String sex) {
30         this.sex = sex;
31     }
32 
33     public void setAge(int age) {
34         this.age = age;
35     }
36 }

2、传递数据步骤

       //创建Intent对象
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, NewActivity.class);
        //创建实体类
        People people = new People();
        people.setName("Mark");
        people.setSex("boy");
        people.setAge(20);
        //添加传送数据
        intent.putExtra("people", people);
        startActivity(intent);

3、接收数据

     Intent intent = getIntent();
        People people = (People) intent.getSerializableExtra("people");
        Log.i("DATA_SHOW","name-->"+people.getName()+",sex-->"+people.getSex()+",age-->"+people.getAge());

4、Log打印

15794-15794/? I/DATA_SHOW﹕ name-->Mark,sex-->boy,age-->20

二、实体类继承Parcelable接口的方式

1、实体类实现Parcelable接口

public class Student implements Parcelable {}

重写接口的两个方法

    @Override
    public int describeContents() {
        return 0;
    }
     
    // 将对象的需要传递的属性 以 Parcel parcel.writXxx的形式写出,具体看属性的类型
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeString(sex);
        parcel.writeInt(age);
    }

添加一个常量CREATOR(名字大小必须固定),该常量必须实现Parcelable的内部接口:Parcelable.Creator,并实现该接口中的两个方法

public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {

        @Override
        public Student createFromParcel(Parcel source) {
            Student student = new Student();
            student.name = source.readString();
            student.sex = source.readString();
            student.age = source.readInt();
            return student;
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };

2、传递数据

     Intent intent = new Intent();
        intent.setClass(MainActivity.this, NewActivity.class);
        Student student = new Student();
        student.setName("Alice");
        student.setSex("girl");
        student.setAge(19);
        intent.putExtra("student",student);
        startActivity(intent);

3、接收数据

     Intent intent = getIntent();
        Student student = intent.getParcelableExtra("student");
        Log.i("DATA_SHOW","name-->"+student.getName()+",sex-->"+student.getSex()+",age-->"+student.getAge());

4、Log日志

1280-1280/? I/DATA_SHOW﹕ name-->Alice,sex-->girl,age-->19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cmazxiaoma的架构师之路

你真的了解Spring MVC处理请求流程吗?

2224
来自专栏java思维导图

自己手写一个 SpringMVC 框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring 框架对于 Java 后端...

3866
来自专栏编码小白

tomcat请求处理分析(六)servlet的处理过程

1.1.1.1  servlet的解析过程 servlet的解析分为两步实现,第一个是匹配到对应的Wrapper,第二个是加载对应的servlet并进行数据,这...

5377
来自专栏菩提树下的杨过

struts2: 玩转 rest-plugin

近期使用struts2的rest-plugin,参考官方示例struts2-rest-showcase,做了一个restful service小项目,但官网提供...

2425
来自专栏向治洪

[置顶] 浅谈我为什么选择用Retrofit作为我的网络请求框架

比较AsyncTask、Volley、Retrofit三者的请求时间 使用 单次请求 7个请求 25个请求 AsyncTask 94...

1945
来自专栏wannshan(javaer,RPC)

dubbo序列化过程源码分析

先看下dubbo在serialize层的类设计方案 序列化方案的入口,是接口Serialization的实现类。 /** * Serialization. ...

4569
来自专栏Java爬坑系列

【Java入门提高篇】Day1 抽象类

  基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分...

1716
来自专栏向治洪

Android 几种网络请求的区别与联系

HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android...

2075
来自专栏码匠的流水账

聊聊spring cloud的RequestHeaderToRequestUriGatewayFilter

本文主要研究一下spring cloud的RequestHeaderToRequestUriGatewayFilter

421
来自专栏Android中高级开发

Android开发之漫漫长途 X——Android序列化

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

602

扫码关注云+社区