当前位置: 代码迷 >> Android >> Android之旅十三 android中的数据传送方法
  详细解决方案

Android之旅十三 android中的数据传送方法

热度:54   发布时间:2016-04-28 06:18:51.0
Android之旅十三 android中的数据传递方法

   android开发中,我们的Activity之间总避免不了进行数据的传递,几种传递方式大致如下,各有各的用处:

1、Intent携带简单的数据

Intent intent=new Intent();Bundle bundle=new Bundle();bundle.putString("username","Mary");bundle.putInt("age",23);intent.putExtras(bundle);


参数接收:

Bundle bundle=getIntent().getExtras();String username=bundle.getString("username");int age=bundle.getInt("age");


2、Intent携带例如ArrayList之类复杂的数据
注意:在传参数前,要用新增加一个List将对象包起来
初始化数据:

Map<String,String> map=new HashMap<String,String>();map.put("aaa","hello");map.put("bbb","world");List<Map<String,String>> list=new ArrayList<Map<String,String>>();list.add(map);Intent intent=new Intent();Bundle bundle=new Bundle();//须定义一个list用于在bundle中传递需要传递的List<Object>,这个是必须要的ArrayList bundleList=new ArrayList();bundleList.add(list);bundle.putParcelableArrayList("list",bundleList);intent.putExtras(bundle);

参数接收:

Bundle bundle=getIntent().getExtras();List bundleList=bundle.getParcelbleArrayList("list");List<Map<String,String>> list=(List<Map<String,String>>)bundleList.get(0);//遍历输出


3、通过实现Serializable接口传递参数
初始化数据:

Map<String,String> map=new HashMap<String,String>();map.put("aaa","hello");map.put("bbb","world");Bundle bundle=new Bundle();bundle.putSerializable("map",map);Intent intent=new Intent();intent.putExtras(bundle);


参数接收:

Bundle bundle=getIntent().getExtras();//HashMap没问题//LinkedHashMap,转换时会抛出ClassCastException,何解Map<String,String> map=(Map<String,String>)bundle.getSerializable("map");//遍历输出


4、通过实现Parcelable接口,把要传的数据打包在里面,然后在接收端自己分解出来。这个是Android独有的,在其本身的源码中也用得很多,效率要比Serializable相对要好。

Parcelable实现要点:需要实现三个东西

1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

2)describeContents方法。没搞懂有什么用,反正直接返回0也可以

3)静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in) 实现从in中创建出类的实例的功能

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。

定义一个DataParcelable实现Parcelable接口,将要传输的数据定义在这个类里面:

package com.xin.activity;import java.util.HashMap;import java.util.Map;import android.os.Parcel;import android.os.Parcelable;public class DataParcelable implements Parcelable{	//定义要被传输的数据	public int age;	public String username;	public String password;	public Map<String,String> map=new HashMap<String,String>();	@Override	public int describeContents() {		return 0;	}	/**	 * 类的数据写入外部提供的Parcel	 */	@Override	public void writeToParcel(Parcel out, int flags) {		//将数据映射到Parcel中去		out.writeInt(age);		out.writeString(username);		out.writeString(password);		out.writeMap(map);	}		public static final Parcelable.Creator<DataParcelable> CREATOR=new Parcelable.Creator<DataParcelable>() {		/**		 * 创建出类的实例		 */		@SuppressWarnings("unchecked")		@Override		public DataParcelable createFromParcel(Parcel in) {			DataParcelable data=new DataParcelable();			//将映射在Parcel对象中的数据还原出来			//这里的顺序一定要和writeToParcel中定义的顺序一致才行			data.age=in.readInt();			data.username=in.readString();			data.password=in.readString();			data.map=in.readHashMap(HashMap.class.getClassLoader());			return data;		}		@Override		public DataParcelable[] newArray(int size) {			return new DataParcelable[size];		}	};}

注意上面方法中createFromParcel读取的顺序要和writeToParcel写入的顺序一致才行,这样才能保证相同数据类型的数据能够按顺序被读取出来!里面是这样的一个设计机制


初始化DataParcelable数据并将其放到Intent对象中去:

				Intent intent=new Intent(MainActivity.this,OtherActivity.class);				DataParcelable data=new DataParcelable();				data.age=23;				data.username="hello";				data.password="world";				data.map=new HashMap<String,String>();				data.map.put("aaa","123");				data.map.put("bbb","456");				intent.putExtra("data", data);				startActivity(intent);

读取DataParcelable中的数据:

                   Intent intent=getIntent();		DataParcelable data=intent.getParcelableExtra("data");		System.out.println("age="+data.age+",username="+data.username+",password="+data.password+",map="+data.map);

大家根据自己的需要和使用场景,选择自己的数据存储方式吧!!

  相关解决方案