Android 如何通过Intent在activity之间传递自定义对象

简介:

能解决这个问题真的太让人兴奋,这里要普及一个知识点,那就是所谓的序列化。

序列化:将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

大家读不读得懂先暂且不说,因为概念什么的东西我也最烦了,大家只要知道用序列化能实现我们想做的事情就OK了(就是标题所说的功能)。

在大多数实战项目中进行两个页面之间的切换时,不会只传一个int或者string那么轻松,就算是传稍微加点料的大众类型(比如int数组或List<string>之类的)其实也没什么大不了的,因为在Intent类中有多个putExtra的重载方法,足以满足我们的需求。

但人们总是“贪婪”的,哈哈,有的时候这些简单的类型无法满足我们的需求,我们通过会要求传递一个自定义的类或者该类的集合,我们不知道这么说大家头脑中有没有概念。举个例子:我们要向另一个activity传递一个人(Person)的对象,Android中没有Person这个类,是我们自定义的。所以要想利用Intent去传递Person或者List<Person>这样的对象,我们就要使用到序列化了。这不是一个好消息吗?至少我们有解决的办法了。

在给大家上代码示例之前,还要再多说点,在Android中使用序列化有两种方法:(1)实现Serializable接口(2)实现Parcelable接口

其中Parcelable是Android特有的功能,效率要比实现Serializable接口高。实现Serializable接口非常简单,声明一下就可以了。而实现Parcelable虽然稍微复杂一些,但效率高,既然是Android特有用来做序列化使用的,那我们就推荐用这种方法。

下面请看代码示例:

首先需要写一个实现Parcelable接口的类,代码中的1,2,3条是实现Parcelable接口序列化对象必须要有的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//1、实现Parcelable接口
public  class  Person  implements  Parcelable{ 
                     
         private  String name 
         private  int  age; 
                     
         public  Person() 
         {} 
                     
         public  Person(String name,  int  age) 
        
             this .name = name; 
             this .age = age; 
        
         public  String getName() 
        
             returnthis.name; 
        
                     
         public  void  setName(String name) 
        
             this .name = name; 
        
                     
         public  int  getAge() 
        
             returnthis.age; 
        
                     
         public  void  setAge( int  age) 
        
             this .age = age;
         }
         @Override  public  int  describeContents() { 
                         
             return  0
        
         //2、实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法
         //通常进行重写
         @Override 
         public  void  writeToParcel(Parcel dest,  int  flags) { 
             //把数据写入Parcel
             dest.writeString(name); 
             dest.writeInt(age); 
        
         //3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法
         public  static  final  Parcelable.Creator<Person> CREATOR =  new  Parcelable.Creator<Person>() { 
             @Override 
             public  Person createFromParcel(Parcel source) { 
                 //从Parcel中读取数据
                 //此处read顺序依据write顺序
                 return  new  Person(source.readString(), source.readInt()); 
            
             @Override 
             public  Person[] newArray( int  size) { 
                             
                 return  new  Person[size]; 
            
                         
         }; 
}

这样一个实现Parcelable接口序列化类就创建好了,那么我们如何用其来进行传递呢?在原activity中我们需要这样传递数据


1
2
3
4
5
6
7
8
9
10
11
12
ArrayList<Person>  lPersonSet =  new  ArrayList<Person>();
Person p1 =  new  Person(“张三”, 20 );
lPersonSet.add(p1);
Person p2 =  new  Person(“李四”, 22 );
lPersonSet.add(p2);
Person p3 =  new  Person(“王五”, 21 );
lPersonSet.add(p3);
//进行页面跳转
Intent intent =  new  Intent();
intent.putParcelableArrayListExtra( "com.example.utilities.personset" , lPersonSet);
intent.setClass(MyActivity. this , OtherActivity. class );
MyActivity. this .startActivity(intent);
 
 

而在OtherActivity中呢?我们需要这样接收数据

1
2
3
ArrayList<Person> lPersonSet =  new  ArrayList<Person>();
Intent intent = getIntent();
lPersonSet = intent.getParcelableArrayListExtra( "com.example.utilities.personset" );

这样就搞定一切了,其他的形式大家可以自由发挥了,重点还是在如何实现Parcelable接口序列化类上。










本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1407257,如需转载请自行联系原作者

目录
相关文章
|
10天前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
25 3
|
3天前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
13 0
|
2月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
2月前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
3天前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
21天前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
33 4
|
28天前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
52 10
|
1月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
35 3
|
1月前
|
前端开发 Android开发 开发者
安卓应用开发中的自定义视图基础
【9月更文挑战第13天】在安卓开发的广阔天地中,自定义视图是一块神奇的画布,它允许开发者将想象力转化为用户界面的创新元素。本文将带你一探究竟,了解如何从零开始构建自定义视图,包括绘图基础、触摸事件处理,以及性能优化的实用技巧。无论你是想提升应用的视觉吸引力,还是追求更流畅的交互体验,这里都有你需要的金钥匙。
|
1月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。