Android开发之使用Intent进行自定义类型数据传输
一、引言
我相信一定有人想通过Intent传送自定义类型的数据,但是苦于无法找到putExtra(String name,Object value)这个方法,最后都会妥协,采用字典或者全局变量来
解决,但是你一定也看到了以下这个方法pubExtra(String name,Parcelable value),我相信那些懒惰的人们,可能会一概而过。却不曾想你错失了良机。下面我们将会
全面的介绍如何使用Parcelable(这个是接口,并不是一个类)
二、正文
首先我们看下需要实现这个方法的哪些部分:

其中只有writeToParcel方法是重点,因为这个方法就是将我们这个类的数据写入到Parcel中以便传递。但是这里告诉你一个悲剧的事情,那就是Parcel只有
writeXXXX(XXXX value),readXXXX() 方法,其中XXXX表示的是数据类型。这里要重点注意的是writeXXXX是没有name参数的,这就以为着你无法区分同一种类型数据
具体是什么。但是Parcel提供一个方法 setDataPosition(int pos) 方法。等同于可以切换当前添加数据的索引,就好比我们用了Parelable数组一样的效果,填充好
了一个Parelable的数据之后使用setDataPosition切换到下一索引继续填充数据。
下面是一个示例:

在这里我们这个类只有一个mData变量,并且在方法writeToParcel中将这个变量写到了Parcel中,但是到这里并没有结束。你可以简单的想想,这里我们仅仅将数据存到了Parcel中,
但是怎么恢复数据呢?因为最后Intent是通过Parcel类进行实际的数据传送,等传送到目的之后,当然还需要恢复,所以我们还要实现一个接收Parcel类的构造方法:

到这里我们仅仅是入门了,如果你是有心人可以将鼠标点到这个类的名称部分会看到以下的提示:

显然我们并没有好好的完成这个功能,我们还缺少一个CREATOR字段,当然要求创建这个字段并不是毫无意义的,而且对这个字段也
有要求,必须是Parcelable.Creator<T>类型,其中的T就是我们需要从Parcel转换到的目的类型。
既然我们知道还缺少东西,下面我们就补全:

这里需要讲述的是 writeToParcel 和 createFromParcel 这两个方法,在实际传递过程中,当我们把这个自定义类型作为Intent的参数进行传
递时writeToParcel会被调用,意思就是告诉你可以将你的数据封装了,然后到了目的之后再通过调用createFromParcel将封装的数据再恢复回去。
这样就可以将数据的转换全部封装到数据类中,而无需以后在使用的过程中去转换。
Android开发之使用Intent进行自定义类型数据传输的更多相关文章
- Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...
- Android开发-API指南-Intent和Intent过滤器
Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...
- Android开发中使用Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...
- Android开发-取消程序标题栏或自定义标题栏
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在Android开发中,跟据需要我们有时候需要自定义应用程序的标题栏或者取消程序的标题栏,下面本菜鸟在此记录与分享一下自己使用的方法 ...
- Android开发学习之Intent具体解释
Intent简单介绍和具体解释: Intent:协助应用间的交互与通信,Intent负责相应用中一次操作的动作.动作涉及的数据.附加数据进行描写叙述. ...
- 从零开始学android开发-详细谈谈intent的startActivityForResult()方法
1.两种实现activity跳转的方法 实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();例如activity A跳转到act ...
- Android开发常用的Intent的URI及示例
参考资料:http://www.oschina.net/code/snippet_166763_6502 //以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent. / ...
- android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
public static Intent openFile(String filePath){ File file = new File(filePath); if(!file.exists()) r ...
随机推荐
- Mysql中的条件语句if、case
Mysql中的条件语句在我们对数据进行转换的时候比较有用,这样就不需要创建中转表. IF 函数 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> ...
- Django查询 – id vs pk
当编写django查询时,可以使用id / pk作为查询参数. Object.objects.get(id=1) Object.objects.get(pk=1) pk代表主键(primary key ...
- java问题排查命令
java问题排查命令 jps:查看java进程 jmap:导出堆详细信息(与jhat一起使用) jhat:分析Java堆的命令(与jmap一起使用) jstack:可以定位到线程堆栈,根据堆栈信息我们 ...
- Asp.net WebAPi gzip压缩和json格式化
现在webapi越来越流行了,很多时候它都用来做接口返回json格式的数据,webapi原本是根据客户端的类型动态序列化为json和xml的,但实际很多时候我们都是序列化为json的,所以webapi ...
- 微信公众号网页授权获取用户openid
最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必须要获取到用户的openid. 这是微信官方文档https://mp.weixin.qq.com/wiki?t=re ...
- WPF 动态改变窗口大小
1.删除 Width 和 Height 属性:2.将 Windows.SizeToContent 属性设置为 WidthAndHeight这时窗口就能自动调整自身大小,从而容纳所包含的内容. 通过将 ...
- 【转】BFC是什么
原文:https://www.cnblogs.com/mlw1814011067/p/10397999.html ------------------------------------------- ...
- Total Commander如何设置自定义快捷键在当前目录打开ConEmu
Total Commander,简称TC,原名Windows Commander,是Windows平台下功能最强大的全能文件管理器. 自从使用了TC基本上就很少再打开Window的文件夹了,因为TC不 ...
- Android利用RecognizerIntent识别语音并简单实现打电话动作
关于Android利用RecognizerIntent识别语音并简单实现打电话,详细看实现代码例如以下: package com.example.recognizerintentactivity; i ...
- python性能还是不错的
一个未优化的程序,跑了四天,字典长度有15万条,每条40个字段,跑得还算不错. 刚刚优化后的: 等运行两天后再看看效果...