安卓通过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<Person> CREATOR = new Creator<Person>() {

        @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);
    }

参考:http://xiaomi4980.blog.163.com/blog/static/21594519620141236363445/

http://www.cnblogs.com/carlosk/archive/2012/09/28/2707521.html

时间: 2024-08-03 23:33:39

安卓通过putExtra传递数据的几种方式的相关文章

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

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

EF5(7) 后台使用SelectListItem传值给前台显示Select下拉框;mvc后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式

一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Order控制器,显示订单列表,并且在修改订单的时候,把用户的id 用 select 下拉框显示出来,并且可以提交修改数据   1.1 我们通过比较原始的方法,来把数据 传递到前台后,前台使用  循环来显示 select 并且显示是哪个元素被选中 我们在前台的cshtml中,使用 @model 命令 指定

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

react之传递数据的几种方式 1.父子传值 父传值:<子的标签 value={'aaa'} index={'bbb'}></子的标签> 子接值:<li key={this.props.index}>{this.props.value}</li> 不止可以传值也可以传递方法: 父:方法={this.方法} 子:{this.props.方法.bind(this)} 传来的参数子组件可以使用,此处用{value,index}等解构赋值省去this.props 此

Android 学习之路 1:Activity之间传递数据的四种方式

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

android中activity之间传递数据的3种方式

在android开发中总是需要不停的传递数据,特别是不同的Activity之间.在这里小编介绍自己所知的3种Activity的跳转方式. 第一种:静态传递数据 直接上部分代码:在第一个Activity中 Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); SecondActivity.usrname = "jack"; SecondActivity.password

在不同Activity传递数据(四种方式)

四种传递方法: 1.通过Intent传递数据: 2.通过静态变量传递数据: 3.通过剪切板传递数据: 4.通过全局对象传递数据: 分类介绍: 1.通过Intent传递数据: 代码如下: 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_

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

转自:http://www.cnblogs.com/zhuqil/archive/2010/08/03/Passing-Data-from-Controllers-to-View.html 在Asp.net mvc开发中,Controller需要向View提供Model,然后View将此Model渲染成HTML.这篇文章介绍三种由Controller向View传递数据的方式,实现一个DropDownList的显示. 第一种:ViewData ViewData是一个Dictionary.使用非常简

intent传递数据的二种方式startActivityForResult为什么不行?

============问题描述============ package com.example.intentsenddatademo; import java.util.List; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.content.Inten

总结前台传递数据的几种方式:

1.JQuery的ajaxSubmit(obj)方法 ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先引入这个插件. 它是如何传递数据的呢?首先我们需要一个form表单: <form id="mainform" name="mainform" action="myaction" method="post"> 标题:<input type=&