当前位置: 代码迷 >> Android >> Android经过Intent传输包含自定义类的ArrayList
  详细解决方案

Android经过Intent传输包含自定义类的ArrayList

热度:58   发布时间:2016-04-28 05:03:58.0
Android通过Intent传输包含自定义类的ArrayList

前言

之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList。

Serializable

Java的对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并且能在需要的时候再将这个字节序列完全恢复为之前的对象。

想实现对象的序列化,需要实现java.io.Serializable接口(注意,这个接口只是一个标记接口,并没有具体需要override的方法)。当然,你也可以自己实现对象的序列化,但是我认为既然Java提供了这么一套对象序列化的机制,我们最好还是使用官方提供的方法。

Example

创建一个简单对象,并且实现Serializable接口

package javastudy;import java.io.Serializable;public class Person implements Serializable {	private static final long serialVersionUID = -6470574927973900913L;	private String firstName;	private String secondName;	// example for transinet	private transient String noSerializableString;	public Person(String firstName, String secondName, String noSerializableString) {		super();		this.firstName = firstName;		this.secondName = secondName;		this.noSerializableString = noSerializableString;	}	public String getFirstName() {		return firstName;	}	public void setFirstName(String firstName) {		this.firstName = firstName;	}	public String getSecondName() {		return secondName;	}	public void setSecondName(String secondName) {		this.secondName = secondName;	}	public String getNoSerializableString() {		if (noSerializableString != null) {			return noSerializableString;		} else {			return "";		}	}	public void setNoSerializableString(String noSerializableString) {		this.noSerializableString = noSerializableString;	}	public String toString() {		return "Person [ first name :" + getFirstName() + ", second name :" + getSecondName() + ", no serializable :"				+ getNoSerializableString() + "]";	}}

再写一个类,用于实现对象的序列化和反序列化

package javastudy;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class TestSerializable {	public static void main(String[] args) {		Person person = new Person("Wang", "Zhengyi", "Genius");		String fileName = "/tmp/person.out";		// save object to file		FileOutputStream fos = null;		ObjectOutputStream out = null;		try {			fos = new FileOutputStream(fileName);			out = new ObjectOutputStream(fos);			out.writeObject(person);			out.flush();		} catch (Exception e) {			e.printStackTrace();		} finally {			if (fos != null) {				try {					fos.close();				} catch (IOException e) {					e.printStackTrace();				}			}			if (out != null) {				try {					out.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}		// read object from file		FileInputStream fin = null;		ObjectInputStream in = null;		try {			fin = new FileInputStream(fileName);			in = new ObjectInputStream(fin);			Person p = (Person) in.readObject();			System.out.println(p);		} catch (Exception e) {			e.printStackTrace();		} finally {			if (fin != null) {				try {					fin.close();				} catch (IOException e) {					e.printStackTrace();				}			}			if (in != null) {				try {					in.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}	}}

Intent传输包含自定义类的ArrayList

之所以之前介绍了Serializable,是因为这是实现Intent传输的前提,ArrayList包含的自定义类必须实现Serializable接口才能通过putSerializable()方法被传递。

还是用上面的Person类作为自定义的类,则第一个传递ArrayList的Activity关键代码如下:

// Intent Creation and InitializationIntent passIntent = new Intent();passIntent.setClass(MainActivity.this, SecondaryActivity.class);                 // Create custom class ObjectPerson p1 = new Person("Wang", "Zhengyi", "first");Person p2 = new Person("Chen", "Shan", "second");                 // Create Array List of custom Class and add the Created objectArrayList<Person> aListClass = new ArrayList<Person>();aListClass.add(p1);aListClass.add(p2);                 // Create a Bundle and Put Bundle in to itBundle bundleObject = new Bundle();bundleObject.putSerializable("key", aListClass);                 // Put Bundle in to Intent and call start ActivitypassIntent.putExtras(bundleObject);startActivity(passIntent);

第二个接收ArrayList的Activity关键代码如下:

try{    // Get the Bundle Object            Bundle bundleObject = getIntent().getExtras();                     // Get ArrayList Bundle    ArrayList<Person> classObject = (ArrayList<Person>) bundleObject.getSerializable("key");                     Retrieve Objects from Bundle    for(int index = 0; index < classObject.size(); index++){                         Person person = classObject.get(index);        Toast.makeText(getApplicationContext(), person, Toast.LENGTH_SHORT).show();    }} catch(Exception e){    e.printStackTrace();}


  相关解决方案