Android编程实现使用Intent传输包含自定义类的ArrayList示例
本文实例讲述了Android编程实现使用Intent传输包含自定义类的ArrayList。分享给大家供大家参考,具体如下:
前言
之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList。
Serializable
Java的对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并且能在需要的时候再将这个字节序列完全恢复为之前的对象。
想实现对象的序列化,需要实现java.io.Serializable接口(注意,这个接口只是一个标记接口,并没有具体需要override的方法)。当然,你也可以自己实现对象的序列化,但是我认为既然Java提供了这么一套对象序列化的机制,我们最好还是使用官方提供的方法。
Example
创建一个简单对象,并且实现Serializable接口
package javastudy;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -6470574927973900913L;
private String firstName;
private String secondName;
// example for transinet
private transient String noSerializableString;
public Person(String firstName, String secondName, String noSerializableString) {
super();
this.firstName = firstName;
this.secondName = secondName;
this.noSerializableString = noSerializableString;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
public String getNoSerializableString() {
if (noSerializableString != null) {
return noSerializableString;
} else {
return "";
}
}
public void setNoSerializableString(String noSerializableString) {
this.noSerializableString = noSerializableString;
}
public String toString() {
return "Person [ first name :" + getFirstName() + ", second name :" + getSecondName() + ", no serializable :"
+ getNoSerializableString() + "]";
}
}
再写一个类,用于实现对象的序列化和反序列化
package javastudy;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class TestSerializable {
public static void main(String[] args) {
Person person = new Person("Wang", "Zhengyi", "Genius");
String fileName = "/tmp/person.out";
// save object to file
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream(fileName);
out = new ObjectOutputStream(fos);
out.writeObject(person);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// read object from file
FileInputStream fin = null;
ObjectInputStream in = null;
try {
fin = new FileInputStream(fileName);
in = new ObjectInputStream(fin);
Person p = (Person) in.readObject();
System.out.println(p);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fin != null) {
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Intent传输包含自定义类的ArrayList
之所以之前介绍了Serializable,是因为这是实现Intent传输的前提,ArrayList包含的自定义类必须实现Serializable接口才能通过putSerializable()
方法被传递。
还是用上面的Person类作为自定义的类,则第一个传递ArrayList的Activity关键代码如下:
// Intent Creation and Initialization
Intent passIntent = new Intent();
passIntent.setClass(MainActivity.this, SecondaryActivity.class);
// Create custom class Object
Person p1 = new Person("Wang", "Zhengyi", "first");
Person p2 = new Person("Chen", "Shan", "second");
// Create Array List of custom Class and add the Created object
ArrayList<Person aListClass = new ArrayList<Person ();
aListClass.add(p1);
aListClass.add(p2);
// Create a Bundle and Put Bundle in to it
Bundle bundleObject = new Bundle();
bundleObject.putSerializable("key", aListClass);
// Put Bundle in to Intent and call start Activity
passIntent.putExtras(bundleObject);
startActivity(passIntent);
第二个接收ArrayList的Activity关键代码如下:
try{
// Get the Bundle Object
Bundle bundleObject = getIntent().getExtras();
// Get ArrayList Bundle
ArrayList<Person classObject = (ArrayList<Person ) bundleObject.getSerializable("key");
Retrieve Objects from Bundle
for(int index = 0; index < classObject.size(); index++){
Person person = classObject.get(index);
Toast.makeText(getApplicationContext(), person, Toast.LENGTH_SHORT).show();
}
} catch(Exception e){
e.printStackTrace();
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
- github & CSRF
- 如何使用Python读取大文件
- 介绍一种非常好用汇总数据的方式GROUPING SETS
- 史上最大的CPU Bug(幽灵和熔断的OS&SQLServer补丁)
- 数据库副本的自动种子设定(自增长)
- Git 项目推荐 | 基于go+protobuff 实现的分布式
- ReflectASM-invoke,高效率java反射机制原理
- Web应用渗透测试-本地文件包含
- shiro权限控制(二):分布式架构中shiro的实现
- Groovy实现原理分析——准备工作
- HBCTF第一场2个pwn题的简单分析
- ACM竞赛之输入输出(以C与C++为例)
- 能让程序做的事情坚决不用人来做——批量修复markdownlint MD034警告
- swift demo1 tableview
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SSM 单体框架 - 前端开发:用户权限控制,Nginx 和项目部署与发布
- 用 Python 制作飞机大战小游戏
- SSM 单体框架 - 前端开发:视频讲解
- MyBatis 的 `<if test="">` 语句里面使用反单引号的问题
- 30 个Python代码实现的常用功能,精心整理版
- Java 后台开发面试题分享一
- IDEA 报错:no tests were found 和 UnsupportedOperationException
- Angular sandbox项目的tsconfig.json内容一览
- Java 后台开发面试题分享二
- axios 进行同步请求(async+await)
- Axios 各种请求方式传递参数格式
- axios POST提交数据的三种请求方式写法
- Json对象和Json字符串的区别
- 合并/拆分 Excel?Python、VBA轻松自动化
- (数据科学学习手札96)在geopandas中叠加在线地图