Android编程实现使用Intent传输包含自定义类的ArrayList示例
本文实例讲述了Android编程实现使用Intent传输包含自定义类的ArrayList。分享给大家供大家参考,具体如下:
前言
之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList。
Serializable
Java的对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并且能在需要的时候再将这个字节序列完全恢复为之前的对象。
想实现对象的序列化,需要实现java.io.Serializable接口(注意,这个接口只是一个标记接口,并没有具体需要override的方法)。当然,你也可以自己实现对象的序列化,但是我认为既然Java提供了这么一套对象序列化的机制,我们最好还是使用官方提供的方法。
Example
创建一个简单对象,并且实现Serializable接口
packagejavastudy; importjava.io.Serializable; publicclassPersonimplementsSerializable{ privatestaticfinallongserialVersionUID=-6470574927973900913L; privateStringfirstName; privateStringsecondName; //examplefortransinet privatetransientStringnoSerializableString; publicPerson(StringfirstName,StringsecondName,StringnoSerializableString){ super(); this.firstName=firstName; this.secondName=secondName; this.noSerializableString=noSerializableString; } publicStringgetFirstName(){ returnfirstName; } publicvoidsetFirstName(StringfirstName){ this.firstName=firstName; } publicStringgetSecondName(){ returnsecondName; } publicvoidsetSecondName(StringsecondName){ this.secondName=secondName; } publicStringgetNoSerializableString(){ if(noSerializableString!=null){ returnnoSerializableString; }else{ return""; } } publicvoidsetNoSerializableString(StringnoSerializableString){ this.noSerializableString=noSerializableString; } publicStringtoString(){ return"Person[firstname:"+getFirstName()+",secondname:"+getSecondName()+",noserializable:" +getNoSerializableString()+"]"; } }
再写一个类,用于实现对象的序列化和反序列化
packagejavastudy; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.ObjectInputStream; importjava.io.ObjectOutputStream; publicclassTestSerializable{ publicstaticvoidmain(String[]args){ Personperson=newPerson("Wang","Zhengyi","Genius"); StringfileName="/tmp/person.out"; //saveobjecttofile FileOutputStreamfos=null; ObjectOutputStreamout=null; try{ fos=newFileOutputStream(fileName); out=newObjectOutputStream(fos); out.writeObject(person); out.flush(); }catch(Exceptione){ e.printStackTrace(); }finally{ if(fos!=null){ try{ fos.close(); }catch(IOExceptione){ e.printStackTrace(); } } if(out!=null){ try{ out.close(); }catch(IOExceptione){ e.printStackTrace(); } } } //readobjectfromfile FileInputStreamfin=null; ObjectInputStreamin=null; try{ fin=newFileInputStream(fileName); in=newObjectInputStream(fin); Personp=(Person)in.readObject(); System.out.println(p); }catch(Exceptione){ e.printStackTrace(); }finally{ if(fin!=null){ try{ fin.close(); }catch(IOExceptione){ e.printStackTrace(); } } if(in!=null){ try{ in.close(); }catch(IOExceptione){ e.printStackTrace(); } } } } }
Intent传输包含自定义类的ArrayList
之所以之前介绍了Serializable,是因为这是实现Intent传输的前提,ArrayList包含的自定义类必须实现Serializable接口才能通过putSerializable()方法被传递。
还是用上面的Person类作为自定义的类,则第一个传递ArrayList的Activity关键代码如下:
//IntentCreationandInitialization IntentpassIntent=newIntent(); passIntent.setClass(MainActivity.this,SecondaryActivity.class); //CreatecustomclassObject Personp1=newPerson("Wang","Zhengyi","first"); Personp2=newPerson("Chen","Shan","second"); //CreateArrayListofcustomClassandaddtheCreatedobject ArrayListaListClass=newArrayList (); aListClass.add(p1); aListClass.add(p2); //CreateaBundleandPutBundleintoit BundlebundleObject=newBundle(); bundleObject.putSerializable("key",aListClass); //PutBundleintoIntentandcallstartActivity passIntent.putExtras(bundleObject); startActivity(passIntent);
第二个接收ArrayList的Activity关键代码如下:
try{ //GettheBundleObject BundlebundleObject=getIntent().getExtras(); //GetArrayListBundle ArrayListclassObject=(ArrayList )bundleObject.getSerializable("key"); RetrieveObjectsfromBundle for(intindex=0;index 希望本文所述对大家Android程序设计有所帮助。