安卓通过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); }