25、Android中通过Intent传递对象、集合问题

 

Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!

分类: Android高手进阶   26776人阅读  评论(103)  收藏  举报

大家好,好久不见,今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写了一个简单的Demo,大家就一步一步跟我来吧!

第一步:新建一个Android工程命名为ObjectTranDemo(类比较多哦!)目录结构如下图:

 

25、Android中通过Intent传递对象、集合问题_第1张图片

第二步:修改main.xml布局文件(这里我增加了两个按钮)代码如下

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView    
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="Welcome to Mr wei's blog."  
  11.     />  
  12. <Button  
  13.     android:id="@+id/button1"  
  14.     android:layout_width="fill_parent"  
  15.     android:layout_height="wrap_content"  
  16.     android:text="Serializable"  
  17. />  
  18. <Button  
  19.     android:id="@+id/button2"  
  20.     android:layout_width="fill_parent"  
  21.     android:layout_height="wrap_content"  
  22.     android:text="Parcelable"  
  23. />  
  24. </LinearLayout>   

第三步:新建两个类一个是Person.java实现Serializable接口,另一个Book.java实现Parcelable接口,代码分别如下:

Person.java:

[java]  view plain copy
  1. package com.tutor.objecttran;  
  2. import java.io.Serializable;  
  3. public class Person implements Serializable {  
  4.     private static final long serialVersionUID = -7060210544600464481L;   
  5.     private String name;  
  6.     private int age;  
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public int getAge() {  
  14.         return age;  
  15.     }  
  16.     public void setAge(int age) {  
  17.         this.age = age;  
  18.     }  
  19.       
  20. }  

Book.java:

[javascript]  view plain copy
  1. package com.tutor.objecttran;  
  2. import android.os.Parcel;  
  3. import android.os.Parcelable;  
  4. public class Book implements Parcelable {  
  5.     private String bookName;  
  6.     private String author;  
  7.     private int publishTime;  
  8.       
  9.     public String getBookName() {  
  10.         return bookName;  
  11.     }  
  12.     public void setBookName(String bookName) {  
  13.         this.bookName = bookName;  
  14.     }  
  15.     public String getAuthor() {  
  16.         return author;  
  17.     }  
  18.     public void setAuthor(String author) {  
  19.         this.author = author;  
  20.     }  
  21.     public int getPublishTime() {  
  22.         return publishTime;  
  23.     }  
  24.     public void setPublishTime(int publishTime) {  
  25.         this.publishTime = publishTime;  
  26.     }  
  27.       
  28.     public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {  
  29.         public Book createFromParcel(Parcel source) {  
  30.             Book mBook = new Book();  
  31.             mBook.bookName = source.readString();  
  32.             mBook.author = source.readString();  
  33.             mBook.publishTime = source.readInt();  
  34.             return mBook;  
  35.         }  
  36.         public Book[] newArray(int size) {  
  37.             return new Book[size];  
  38.         }  
  39.     };  
  40.       
  41.     public int describeContents() {  
  42.         return 0;  
  43.     }  
  44.     public void writeToParcel(Parcel parcel, int flags) {  
  45.         parcel.writeString(bookName);  
  46.         parcel.writeString(author);  
  47.         parcel.writeInt(publishTime);  
  48.     }  
  49. }  

第四步:修改ObjectTranDemo.java,并且新建两个Activity,一个是ObjectTranDemo1.java,别一个是ObjectTranDemo2.java.分别用来显示Person对像数据,和Book对象数据:,代码分别如下:

ObjectTranDemo.java:

[java]  view plain copy
  1. package com.tutor.objecttran;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. public class ObjectTranDemo extends Activity implements OnClickListener {  
  9.       
  10.     private Button sButton,pButton;  
  11.     public  final static String SER_KEY = "com.tutor.objecttran.ser";  
  12.     public  final static String PAR_KEY = "com.tutor.objecttran.par";  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);     
  16.         setupViews();  
  17.           
  18.     }  
  19.       
  20.     //我的一贯作风呵呵  
  21.     public void setupViews(){  
  22.         sButton = (Button)findViewById(R.id.button1);  
  23.         pButton = (Button)findViewById(R.id.button2);  
  24.         sButton.setOnClickListener(this);  
  25.         pButton.setOnClickListener(this);  
  26.     }  
  27.     //Serializeable传递对象的方法  
  28.     public void SerializeMethod(){  
  29.         Person mPerson = new Person();  
  30.         mPerson.setName("frankie");  
  31.         mPerson.setAge(25);  
  32.         Intent mIntent = new Intent(this,ObjectTranDemo1.class);  
  33.         Bundle mBundle = new Bundle();  
  34.         mBundle.putSerializable(SER_KEY,mPerson);  
  35.         mIntent.putExtras(mBundle);  
  36.           
  37.         startActivity(mIntent);  
  38.     }  
  39.     //Pacelable传递对象方法  
  40.     public void PacelableMethod(){  
  41.         Book mBook = new Book();  
  42.         mBook.setBookName("Android Tutor");  
  43.         mBook.setAuthor("Frankie");  
  44.         mBook.setPublishTime(2010);  
  45.         Intent mIntent = new Intent(this,ObjectTranDemo2.class);  
  46.         Bundle mBundle = new Bundle();  
  47.         mBundle.putParcelable(PAR_KEY, mBook);  
  48.         mIntent.putExtras(mBundle);  
  49.           
  50.         startActivity(mIntent);  
  51.     }  
  52.     //铵钮点击事件响应  
  53.     public void onClick(View v) {  
  54.         if(v == sButton){  
  55.             SerializeMethod();  
  56.         }else{  
  57.             PacelableMethod();  
  58.         }  
  59.     }  
  60. }  

ObjectTranDemo1.java:

[java]  view plain copy
  1. package com.tutor.objecttran;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.TextView;  
  5. public class ObjectTranDemo1 extends Activity {  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.           
  10.         TextView mTextView = new TextView(this);  
  11.         Person mPerson = (Person)getIntent().getSerializableExtra(ObjectTranDemo.SER_KEY);  
  12.         mTextView.setText("You name is: " + mPerson.getName() + "/n"+  
  13.                 "You age is: " + mPerson.getAge());  
  14.           
  15.         setContentView(mTextView);  
  16.     }  
  17. }  

ObjectTranDemo2.java:

[java]  view plain copy
  1. package com.tutor.objecttran;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.TextView;  
  5. public class ObjectTranDemo2 extends Activity {  
  6.    
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         TextView mTextView = new TextView(this);  
  10.         Book mBook = (Book)getIntent().getParcelableExtra(ObjectTranDemo.PAR_KEY);  
  11.         mTextView.setText("Book name is: " + mBook.getBookName()+"/n"+  
  12.                           "Author is: " + mBook.getAuthor() + "/n" +  
  13.                           "PublishTime is: " + mBook.getPublishTime());  
  14.         setContentView(mTextView);  
  15.     }  
  16. }  

第五步:比较重要的一步啦,修改AndroidManifest.xml文件(将两个新增的Activity,ObjectTranDemo1,ObjectTranDemo2)申明一下代码如下(第14,15行):

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.tutor.objecttran"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <activity android:name=".ObjectTranDemo"  
  8.                   android:label="@string/app_name">  
  9.             <intent-filter>  
  10.                 <action android:name="android.intent.action.MAIN" />  
  11.                 <category android:name="android.intent.category.LAUNCHER" />  
  12.             </intent-filter>  
  13.         </activity>  
  14.         <activity android:name=".ObjectTranDemo1"></activity>  
  15.         <activity android:name=".ObjectTranDemo2"></activity>  
  16.     </application>  
  17.     <uses-sdk android:minSdkVersion="7" />  
  18. </manifest>   

第六步:运行上述工程查看效果图啦:

效果1:首界面:

25、Android中通过Intent传递对象、集合问题_第2张图片

效果2:点击Serializable按钮

25、Android中通过Intent传递对象、集合问题_第3张图片

效果3:点击Parcelable按钮:

25、Android中通过Intent传递对象、集合问题_第4张图片

OK~今天就先到这里了,大家如果要嫌代码过长,不想敲的话,可以留下Email.俺给你邮过去,呵呵~希望对大家 有点小帮助 ,bye~







刚刚接触android不久所以对intent中传递数据不是很来了解特此记录下来以备忘 

同时也希望一次来帮助新手(至少我经历过应该可以说是老手了吧,呵呵。。。往脸上贴金了!) 

另外我还对intent中传递参数还有一点小问题希望有人能为我解释一下疑惑 

入正题: 
需求:在多个activity之间传递对象集合 

解决方案: 
第一:我们可以定义一个继承application的这样的一个类这样我们就可以在整个应用中使用了 此方案可行! 
第二:我们可以通过intent 来传递。 

关于intent的知识回顾: 

对intent 中传递参数的问题并不麻烦,我们知道intent中可以传递基本数据类的数据,可以传递String 可以传递 对象(但是对象必须实现序列化),另外intent也可以传递集合 
但是对于集合有限制只能传递ArrayList,而且还必须是包装了泛型是Integer 或者String 这样形式的,但是根据我的需求intent 貌似满足不了,但是intent 中可以传递bundle在bundle 中我们可以看到能够传递一个实现了parcelable接口的对象集合 
具体代码如下: 
实体: 
Java代码   收藏代码
  1. public class OBean implements Serializable,Parcelable {  
  2.     private static final long serialVersionUID = 1L;  
  3.       
  4.     private String messageName;  
  5.       
  6.     private String xmlPath;  
  7.   
  8.     public OBean(){}  
  9.       
  10.     private OBean(Parcel parcel){  
  11.         messageName = parcel.readString();  
  12.         xmlPath     = parcel.readString();        
  13.     }  
  14.     @Override  
  15.     public void writeToParcel(Parcel dest, int flags) {  
  16.         dest.writeString(messageName);  
  17.         dest.writeString(xmlPath);  
  18.     }  
  19.     public static final Parcelable.Creator<OBean> CREATOR = new Parcelable.Creator<OBean>() {  
  20.   
  21.         @Override  
  22.         public OBean createFromParcel(Parcel source) {  
  23.             return new OBean(source);  
  24.         }  
  25.   
  26.         @Override  
  27.         public OBean[] newArray(int size) {  
  28.             return new OBean[size];  
  29.         }  
  30.     };  
  31.       
  32.     public String getMessageName() {  
  33.         return messageName;  
  34.     }  
  35.   
  36.     public void setMessageName(String messageName) {  
  37.         this.messageName = messageName;  
  38.     }  
  39.   
  40.     public String getXmlPath() {  
  41.         return xmlPath;  
  42.     }  
  43.   
  44.     public void setXmlPath(String xmlPath) {  
  45.         this.xmlPath = xmlPath;  
  46.     }  
  47.   
  48.     public static long getSerialversionuid() {  
  49.         return serialVersionUID;  
  50.     }  
  51.   
  52.     @Override  
  53.     public int describeContents() {  
  54.         return 0;  
  55.     }  
  56.   
  57. }  

我们实现了parcelable接口 实现了序列化;可以看到Parcelable 帮我们为OBean赋值了 

但是这个过程中我有一点不明白如下: 
Java代码   收藏代码
  1. private OBean(Parcel parcel){  
  2.         messageName = parcel.readString();  
  3.         xmlPath     = parcel.readString();        
  4.     }  
  5.     @Override  
  6.     public void writeToParcel(Parcel dest, int flags) {  
  7.         dest.writeString(messageName);  
  8.         dest.writeString(xmlPath);  
  9.     }  


这个过程的readString 和writeString 有没有顺序的限制? 
我看了相关文档结果没有发现能够帮我理解此问题的有利根据,所以希望哪位大神能指点一下 

如上所述完成了 这一个过程就基本上完成了传递对象集合的80%了 

剩下的20%: 
Java代码   收藏代码
  1. ArrayList<OBean> list = OMessageParser.getOMessageBean(context,"OMessage.xml");  
  2.         Intent OMIntent = new Intent();  
  3.         Bundle   bundle  = new Bundle();  
  4.         bundle.putParcelableArrayList("OBeanList", list);  

这样的话我们在 
putParcelableArrayList 的时候只需要把 包装好的ArrayList<OBean> 写进去就好了 

但是到这个地方我还是有疑问了。。为什么intent 只能传递ArrayList不能传递List或者其他的数据结构呢? 





你可能感兴趣的:(java,android,object,layout,button,encoding,Android高手进阶)