我们都是用过 Intent,用它来在组件之间传递数据,所以说 Intent 是组件之间通信的使者,一般情况下,我们传递的都是一些比较简单的数据,并且都是基本的数据类型,写法也比较简单,今天我在这里说的是如何使用 Intent 传递对象及集合,我们知道Intent 是不能直接传递没有序列化的对象的,说到序列化,我们都知道,序列化有两种方式,即实现 Sereriable 或者 Paracelable 接口。默认情况下,像 List、Bitmap 等默认帮我们已经实现了序列化,我们就可以直接进行传递,还有一些像 Map 集合,自定义的 class,默认是没有实现序列化的接口的,我们必须要先实现序列化才可以进行传递。

1.传递序列化对象
1.1 方式一

这种方式比较简单,我们可以先将对象使用 Gson 先序列化成 Json 字符串,然后作为字符串来使用 Intent,这种方式的好处是不需要实现 Sereriable 或者 Paracelable,坏处就是需要额外的使用 Gson 来序列化和解析。

代码示例:

ActivityA 中设置数据:

User user = new User();
user.setName("Jack");
user.setAge();
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra("user", new Gson().toJson(user));
startActivity(intent);

ActivityB 中获取数据:


String json = getIntent().getStringExtra("user");
User user = new Gson().fromJson(json, User.class);

1.2 方式二

这种方式就是将数据封装到 Bundle 中然后把 Bundle 对象调用 Intent 的 putExtra 方法然后传递过去,Bundle 类默认也是已经实现了 Parcelable 接口的,所以可以传递 Bundle 对象。

代码示例:

ActivityA 中设置数据:

// 创建一个Bundle对象封装数据
Bundle data = new Bundle();
data.putInt("age", );
data.putString("name", "Jack");
intent.putExtra("data", data);

ActivityB 中获取数据:

Bundle data = getIntent().getBundleExtra("data");
int id = data.getInt("age");
String name = data.getString("name");

1.3 方式三

传递实现了 Serializable 接口的对象,这种方式也比较简单,传递之前先实现 Serializable 接口,也不需要重写方法。

代码示例:

ActivityA 中设置数据:

User user = new User();
user.setName("Jack");
user.setAge();
Intent intent = new Intent(ActivityA.this, ActivityB.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);
startActivity(intent);

ActivityB 中获取数据:

Intent intent = getIntent();
User user = (User)intent.getSerializableExtra("user");

 1.4 方式四
传递实现了 Parcelable 接口的对象,这种方式比实现 Serializable 接口的方式稍微麻烦一点,需要重写方法,不过我们程序员都是比较懒的,给大家推荐一个插件: android-parcelable-intellij-plugin ,安装完之后就可以使用快捷键自动生成实现了 Serializable 接口的对象了,是不是比较方便。

实现 Serializable 对象的 User 类示例代码如下:

 public class User implements Parcelable {

            private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int describeContents() {
return ;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeInt(this.age);
} public User() {
} protected User(Parcel in) {
this.name = in.readString();
this.age = in.readInt();
} public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
return new User(source);
} @Override
public User[] newArray(int size) {
return new User[size];
}
};
}

传递数据的方法和 Serializable 类似

代码示例:

ActivityA 中设置数据:

User user = new User();
user.setName("Jack");
user.setAge();
Intent intent = new Intent(ActivityA.this, ActivityB.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user", user);
intent.putExtras(bundle);
startActivity(intent);

ActivityB 中获取数据:

Intent intent = getIntent();
User user = (User)intent.getParcelableExtra("user");

2.传递集合类
2.1 传递 List 集合数据

如果我们要传递的 List 集合,我们可以把 List 强转成 Serializable 类型,List 默认是实现了 Serializable 接口的,但是注意 List 的泛型类也必须要实现了 Serializable 接口,基本类型及包装类就不用了。

代码示例:

ActivityA 中设置数据:

User user1 = new User();
user1.setName("Jack");
user1.setAge();
User user2 = new User();
user2.setName("Marry");
user2.setAge();
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtras("list", (Serializable) list);
startActivity(intent);

ActivityB 中获取数据:

Intent intent = getIntent();
List<User> list = (List<User>) getIntent().getSerializableExtra("list");

2.2 传递 Map 集合数据

Map接口及他的实现类默认是没有实现序列化的接口的,我们要想传递 Map 就要让 Map 实现序列化接口,我们可以自定义一个类,以HashMap为例吧,我们的类就叫 SerializableHashMap 吧,然后让定义一个 Map 变量作为成员属性并实现序列化接口,这样我们的类就可以进行传递了,SerializableHashMap 的实现如下:

 public class SerializableHashMap implements Serializable {
private HashMap<String, String> map; public SerializableHashMap() {
} public SerializableHashMap(HashMap<String, String> map) {
this.map = map;
} public HashMap<String, String> getMap() {
return map;
} public void setMap(HashMap<String, String> map) {
this.map = map;
}
}

代码示例:

ActivityA 中设置数据:

HashMap<String, Object> map = new HashMap<>();
map.put("name", "Jack");
map.put("age", );
SerializableHashMap sMap = new SerializableHashMap();
sMap.setMap(map); // 将map数据添加到封装的sMap中
Bundle bundle = new Bundle();
bundle.putSerializable("map", sMap);
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtras(bundle);
startActivity(intent);

ActivityB 中获取数据:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
SerializableHashMap sMap = (SerializableHashMap) bundle.get("map");
HashMap<String, Object> map = sMap.getMap();

2.3 如何选择?

另外,默认 Intent 帮我们实现了,可以支持传递 String 数组等,也比较简单,这里就不赘述了,另外如果数据量比较大的情况下,建议使用第三方框架来进行传递数据,例如:EventBus 等来代替,这样的话可以避免造成 TransactionTooLargeException。

如何选择哪种序列化方式?弄清楚他们的区别,你也就知道使用哪个更合适了。

Serializable 和 Parcelable 接口的区别:

在使用内存的时候,Parcelable 比 Serializable 性能高,所以推荐使用 Parcelable;
    Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC;
    Parcelable 不能使用在要将数据存储在磁盘上的情况,因为 Parcelable 不能很好的保证数据的 持续性,在外界有变化的情况下,尽管 Serializable 效率低点,但此时还是建议使用Serializable;

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10767673.html

转载请著名出处!谢谢~~

[Android] Android 最全 Intent 传递数据姿势的更多相关文章

  1. Android 开发中使用Intent传递数据的方法

    Activity之间通过Intent传递值,支持基本数据类型和String对象及 它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.shor ...

  2. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  3. Android Intent传递数据

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intent=new In ...

  4. Android Activity传递数据使用getIntent()接收不到,揭秘Intent传递数据与Activity启动模式singleTask的关系。

    activity通过intent传递数据的时候,如果activity未启动,那么在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.. 如果要启动的activit ...

  5. Android 消息广播Intent传递数据

    1.创建布局文件activity_broadcast.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

  6. Android学习之Intent传递数据

    Intent在Activity中的作用主要是有两个: 1.启动目标Activity 2.传递数据 Intent在传递数据时分两种情况:向下一个Activity传递数据和从下一个Activity返回数据 ...

  7. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  8. 【Android 复习】 : Activity之间传递数据的几种方式

    在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...

  9. Intent传递数据全解

    概述 之前的博文也有介绍,查看-->用户界面开发基础 这里单独抽取出来,更加具体的记录一下,事实上主要是API的使用. Intent传递简单数据 能够以直接通过调用Intent的putExtra ...

随机推荐

  1. java笔记---- 获取外网(公网)的ip地址

    import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import ...

  2. winform窗体最小化

    const int WM_SYSCOMMAND = 0x112;const int SC_CLOSE = 0xF060;const int SC_MINIMIZE = 0xF020;const int ...

  3. 《SQL CookBook 》笔记-第一章-检索记录

    目录 第一章 检索记录 1.1检索所有行和列 1.2筛选行 1.3查找满足多个查询条件的行 1.4筛选列 1.5创建列的别名 1.6 在where子句中引用别名列 1.7 串联多列的值 1.8 在se ...

  4. WSUS补丁下载速度慢解决办法

    windows 2008r2 如果是 WSUS 3.0并使用 Windows Internal Database(默认安装) %programfiles%\Update Services\Setup\ ...

  5. 【转】分享JavaScript监听全部Ajax请求事件的方法

    若Ajax请求是由jQuery的$.ajax发起的,默认情况下可以使用 jQuery的Global Ajax Event Handlers监听到Ajax事件,然而我遇到的却是用原生JavaScript ...

  6. “百度杯”CTF比赛 十月场EXEC

    前面比较常规吧看源代码-看到vim 然后就是 .index.php.swp 然后就是 这个文件的恢复,用linux下vim -r index.php.swp  就可以看到不是乱码的文件了 然后就是审核 ...

  7. 逆向学习-Upack的PE文见头分析

    重叠文件头 MZ文件头与PE文件头重叠. offest 0 e_magic:magic number = 4D5A('MZ') offest 3C  e_lfanew:File address of ...

  8. Java SpringBoot集成RabbitMq实战和总结

    目录 交换器.队列.绑定的声明 关于消息序列化 同一个队列多消费类型 注解将消息和消息头注入消费者方法 关于消费者确认 关于发送者确认模式 消费消息.死信队列和RetryTemplate RPC模式的 ...

  9. HTML HTML5 新特性

    一.语义化标签 语义化标签 为页面提供了更好的页面结构. 描述 属性 <header></header>  定义文档的头部区域 <footer></foote ...

  10. codeforces#1152D. Neko and Aki's Prank(dp)

    题目链接: https://codeforces.com/contest/1152/problem/D 题意: 给出一个$n$,然后在匹配树上染色边,每个结点的所有相邻边只能被染色一次. 问,这颗树上 ...