通过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传递数据的几种方式的更多相关文章

  1. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  2. .NET MVC控制器向视图传递数据的四种方式

    .NET MVC控制器向视图传递数据的四种方式: 1.ViewBag  ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...

  3. react之传递数据的几种方式props传值、路由传值、状态提升、redux、context

    react之传递数据的几种方式 1.父子传值 父传值:<子的标签 value={'aaa'} index={'bbb'}></子的标签> 子接值:<li key={thi ...

  4. EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))

    一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...

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

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

  6. ASP.NET MVC2中Controller向View传递数据的三种方式

    转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp. ...

  7. Controller和View传递数据的几种方式

    使用ViewBag存储数据,如ViewBag.time=2012/7/1,View中可以直接用ViewBag("time")的方式取出数据. 使用ViewData存储数据,存储对象 ...

  8. React Native原生模块向JS传递数据的几种方式(Android)

    一般情况可以分为三种方式: 1. 通过回调函数Callbacks的方式 2. 通过Promises的异步的方式 3. 通过发送事件的事件监听的方式. 参考文档:传送门

  9. react-native页面间传递数据的几种方式

    1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景: - 表单提交页面, A页面跳转到B页面选人, 然后返回A页面, 需要将B页面选择的数据传回A页面. ...

随机推荐

  1. C++中的异常处理(一)

     来自:CSDN 卡尔  后续有C++中的异常处理(二)和C++中的异常处理(三),C++中的异常处理(二)是对动态分配内存后内部发生错误情况的处理方法,C++中的异常处理(三)中是使用时的异常说明. ...

  2. httpd/php/mysql的安装-1

    rely:  依赖: relier, reliance , reliable : i don't think he is a reliable man . we must lay stress on ...

  3. 类型安全且自动管理内存的返回 std::string 的 sprintf 实现

    在这篇博文里,我提到了一个例子,说的是使用C++实现类型安全的printf.这个例子很惊艳,但是在我写程序的时候,并非那么"迫切"地需要它出现在我的工具箱中,因为它并不比普通的pr ...

  4. Codeforces Round #FF (Div. 2) C. DZY Loves Sequences

    解题报告:输入一个数列,选取一个子数列,要求最多只能改动这个子数列中的一个数,使得这个子数列是严格的升序的(严格升序没有相等的) 我的做法是,第一步把这个 数列的每个升序的子数列都找出来,然后看这些子 ...

  5. [ZJOI3527][Zjoi2014]力

    [ZJOI3527][Zjoi2014]力 试题描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi.试求Ei. 输入 包含一个整数n,接下来n行每行输入一个数,第i行表示qi. 输出 有n ...

  6. MySQL目录

    MySQL的学习总结目录 Mysql5.7安装及配置 教你如何3分钟玩转MYSQL MySQL使用详解--根据个人学习总结 Mysql增删改 Mysql_以案例为基准之查询 MySQL之扩展(触发器, ...

  7. uc_client是如何与UCenter进行通信的

    以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同. 从用户xxx在某一应用程序的login.php,输入用户名,密码讲起.先用uc_user_login函数到uc_server验证此用户和 ...

  8. github student pack中的digital ocean可以使用银联卡支付

    申请了 github student pack却因为一直没有visita信用卡,而无法使用digital ocean的 $50,一直到今天,用中国银行借记卡成功支付. 方法是: (1)注册paypal ...

  9. centos7 安装kvm, 并创建虚拟机

    # yum –y install qemu-kvm qemu-img bridge-utils # yum –y install libvirt virt-install virt-manager # ...

  10. 面向侧面的程序设计AOP-------《一》概述

    Aspect-Oriented Programming(面向方面编程,AOP)正好可以解决这一问题.它允许开发者动态地修改静态的OO模型,构造出一个能够不断增长以满足新增需求的系统,就象现实世界中的对 ...