安卓通过putExtra传递数据的几种方式
通过intent传递数据时,使用以下代码报错:
hMap<string, object=""> map=(Map<string, object="">) parent.getItemAtPosition(position);
intent.putExtra("userInfoMap", map);
但是使用以下的代码是正常的:
HashMap<string, object=""> map=(HashMap<string, object="">) parent.getItemAtPosition(position);
intent.putExtra("userInfoMap", map);
这是为啥呢,作为小白的我上网查找了一番,发现只有能序列化的数据才能放进去,intent传递数据的方法有以下几个:
Intent putExtra(String name, String[] value)
Intent putExtra(String name, Parcelable value)
Intent putExtra(String name, long value)
Intent putExtra(String name, boolean value)
Intent putExtra(String name, double value)
Intent putExtra(String name, Parcelable[] value)
Intent putExtra(String name, char value)
Intent putExtra(String name, int[] value)
Intent putExtra(String name, int value)
Intent putExtra(String name, double[] value)
Intent putExtra(String name, short value)
Intent putExtra(String name, long[] value)
Intent putExtra(String name, boolean[] value)
Intent putExtra(String name, short[] value)
Intent putExtra(String name, String value)
Intent putExtra(String name, Serializable value)
Intent putExtra(String name, float[] value)
Intent putExtra(String name, Bundle value)
Intent putExtra(String name, byte[] value)
Intent putExtra(String name, CharSequence value)
Intent putExtra(String name, char[] value)
Intent putExtra(String name, byte value)
Intent putExtras(Intent src)
Intent putExtras(Bundle extras)
可以看到其可以传递的包括基本数据类型(含基本数据类型的数组)、String(包含数组)、Parcelable(包含数组)、Serializable、Bundle、CharSequence、Intent几种类型的数据。对于Map类型(超类)的数据以及Long,Integer,Double,Byte,Float,Short,由于没有 实现序列化接口,所以无法通过这种方法传递值
对于序列化数据的传递方式,可以采用如下方式传递
提交activity
lst.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView parent, View view,
int position, long id) {
HashMap map=(HashMap) parent.getItemAtPosition(position);
Intent intent=new Intent();
intent.setClass(btsAllinfoActivity.this,btsMapActivity.class);
intent.putExtra("bts_map", map);
startActivity(intent);
}
});
接收数据activity
Intent intent=getIntent();
map=(HashMap)intent.getSerializableExtra("bts_map");
System.out.println("111111111111");
System.out.println(map.get("bt_id"));
System.out.println(map.get("bt_name"));
System.out.println(map.get("bt_lon"));
System.out.println(map.get("bt_lat"));
System.out.println("111111111111");
对于Bundle类型的数据,可以采用如下方式:
提交activity
HashMap map=(HashMap) parent.getItemAtPosition(position);
Intent intent=new Intent();
intent.setClass(btsAllinfoActivity.this,btsMapActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("bts_map", map);
intent.putExtras(bundle); startActivity(intent);
接收activity
Bundle bundle = getIntent().getExtras();
map=(HashMap)bundle.getSerializable("bts_map");
System.out.println("111111111111");
System.out.println(map.get("bt_id"));
System.out.println(map.get("bt_name"));
System.out.println(map.get("bt_lon"));
System.out.println(map.get("bt_lat"));
System.out.println("111111111111");
对于Parcelable类型的数据
对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的。
Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。
实现Serializable接口是JavaSE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,
而且还可以用在进程间通信(IPC)中。实现Serializable接口非常简单,声明一下就可以了。
而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,
也可以从Parcel中恢复其状态。Parcel用来完成数据的序列化传递。
对于Parcel数据的传递方式,可以采用如下方式传递
通过实现Parcelable接口序列化对象的步骤: 1、实现Parcelable接口。
2、并且实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。
3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。
实体类实现接口:
public class Person implements Parcelable {
public static final Parcelable.Creator CREATOR = new Creator() {
@Override
public Person[] newArray(int size) {
return null;
}
@Override
public Person createFromParcel(Parcel source) {
Person result = new Person();
result.age = source.readInt();
result.name = source.readString();
result.address = source.readParcelable(Address.class.getClassLoader());
return result;
}
};
private Address address;
private String name;
private int age;
@Override
public int describeContents() {
return 0;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
dest.writeParcelable(address, PARCELABLE_WRITE_RETURN_VALUE);
}
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 String toString() {
return "Person [address=" + address + ", name=" + name + ", age=" + age
+ "]";
}
}
//官方的文档里说在不同进程之间使用Parce,在同进程内使用Bind,
public void sendBroadCast(View viwe){
Log.d("test",Thread.currentThread().getName()+ "发送了一个消息给广播");
Person person = new Person();
person.setAge(18);
Address address = new Address();
address.setStreet("延陵南路");
person.setName("carlos");
person.setAddress(address);
Intent intent = new Intent("aaaa");
intent.setClass(this, SendActivity.class);
// intent.putParcelableArrayListExtra(name, value)
intent.putExtra("person", person);
startActivity(intent);
}
安卓通过putExtra传递数据的几种方式的更多相关文章
- Android学习笔记(十二)——使用意图传递数据的几种方式
使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...
- .NET MVC控制器向视图传递数据的四种方式
.NET MVC控制器向视图传递数据的四种方式: 1.ViewBag ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...
- react之传递数据的几种方式props传值、路由传值、状态提升、redux、context
react之传递数据的几种方式 1.父子传值 父传值:<子的标签 value={'aaa'} index={'bbb'}></子的标签> 子接值:<li key={thi ...
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...
- 【Android 复习】 : Activity之间传递数据的几种方式
在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...
- ASP.NET MVC2中Controller向View传递数据的三种方式
转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp. ...
- Controller和View传递数据的几种方式
使用ViewBag存储数据,如ViewBag.time=2012/7/1,View中可以直接用ViewBag("time")的方式取出数据. 使用ViewData存储数据,存储对象 ...
- React Native原生模块向JS传递数据的几种方式(Android)
一般情况可以分为三种方式: 1. 通过回调函数Callbacks的方式 2. 通过Promises的异步的方式 3. 通过发送事件的事件监听的方式. 参考文档:传送门
- react-native页面间传递数据的几种方式
1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景: - 表单提交页面, A页面跳转到B页面选人, 然后返回A页面, 需要将B页面选择的数据传回A页面. ...
随机推荐
- 超常用的PHP正则表达式收集整理
以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式. 一.表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-z ...
- 记一个奇怪的python异常处理过程
我的一个程序, 总是在退出时报异常, Exception TypeError: "'NoneType' object is not callable" in <functio ...
- cocos基础教程(2)Window环境下搭建
第一步:开始安装VS2012 第二步:下载Cocos2d-x 3.4源码 配置环境变量 COCOS_CONTROL = E:\cocos2d-x-3.4\tools\cocos2d-console ...
- HDU 1029 Ignatius and the Princess IV
解题报告: 题目大意:就是要求输入的N个数里面出现的次数最多的数是哪一个,水题.暴力可过,定义一个一位数组,先用memset函数初始化,然后每次输入一个数就将下标对应的上标对应的那个数加一,最后将整个 ...
- [Effective JavaScript 笔记]第2章:变量作用域--个人总结
前言 第二章主要讲解各种变量作用域,通过这章的学习,接触到了很多之前没有接触过的东西,比如不经常用到的eval,命名函数表达式,with语句块等,下面是一个列表,我对各节的一点点个人总结,很多都是自己 ...
- window 安装 sass compass 记录
1.安装Ruby 安装sass 和compass 需要 Ruby 的环境,还区分xp 和win7-8 下版本区别 ruby 官网中文 ruby 官网英文 注意: xp: 下载 [xp不能下载包含64位 ...
- Android音频播放实例
MediaPlayer: 此类适合播放较大文件,此类文件应该存储在SD卡上,而不是在资源文件里,还有此类每次只能播放一个音频文件. 1.从资源文件中播放 MediaPlayer player = ne ...
- NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)
Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...
- 通过关闭UseDNS和GSSAPIAuthentication选项加速SSH登录
引自:http://www.cnblogs.com/wjoyxt/p/3790537.html More:http://blogread.cn/it/article/4719 通常情况下我们在连接 O ...
- Mysql数据库中设置root密码的命令及方法
我们都知道通常PHP连接 Mysql都是通过root用户名和密码连接,默认情况下在Mysql安装时root初始密码为空,在安装使用PHP开源系统时,都需要填写连接Mysql数据库的用户名和密码,此时当 ...