Parcelable的实现

来源:互联网 发布:烈焰战车10级升级数据 编辑:程序博客网 时间:2024/06/07 12:56

我发现自己真的好菜,想学点知识,可是不知道从何下手,今天一天状态确实很不好。实在无聊,写点以前遇到过的问题,方便以后用到时查看,更希望能与别人分享。

       本篇博客实现Android activity跳转的时候携带我自定义的实体类

       Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递序列化对象。同样如果我们想传递一个list<实体类>,只要在bundle调用putParcelableArrayList(key, value)即可,当然list里的对象要序例化!

   话不多说,上代码:

[java] view plain copy
  1. package com.weiwend.wj.testactivity;  
  2.   
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5.   
  6. public class UserBean implements Parcelable{  
  7.   
  8.     private String user_name;  
  9.     private int user_age;  
  10.     private int user_sex;  
  11.     private int user_addr;  
  12.       
  13.     public String getUser_name() {  
  14.         return user_name;  
  15.     }  
  16.     public void setUser_name(String user_name) {  
  17.         this.user_name = user_name;  
  18.     }  
  19.     public int getUser_age() {  
  20.         return user_age;  
  21.     }  
  22.     public void setUser_age(int user_age) {  
  23.         this.user_age = user_age;  
  24.     }  
  25.     public int getUser_sex() {  
  26.         return user_sex;  
  27.     }  
  28.     public void setUser_sex(int user_sex) {  
  29.         this.user_sex = user_sex;  
  30.     }  
  31.     public int getUser_addr() {  
  32.         return user_addr;  
  33.     }  
  34.     public void setUser_addr(int user_addr) {  
  35.         this.user_addr = user_addr;  
  36.     }  
  37.       
  38.     public static final Parcelable.Creator<UserBean> CREATOR=new Creator<UserBean>() {  
  39.           
  40.         @Override  
  41.         public UserBean createFromParcel(Parcel source) {  
  42.             UserBean bean=new UserBean();  
  43.               
  44.             bean.user_name=source.readString();  
  45.             bean.user_age=source.readInt();  
  46.             bean.user_sex=source.readInt();  
  47.             bean.user_addr=source.readInt();  
  48.               
  49.             return bean;  
  50.         }  
  51.           
  52.         @Override  
  53.         public UserBean[] newArray(int size) {  
  54.             // TODO Auto-generated method stub  
  55.             return new UserBean[size];  
  56.         }  
  57.     };  
  58.       
  59.     @Override  
  60.     public int describeContents() {  
  61.         // TODO Auto-generated method stub  
  62.         return 0;  
  63.     }  
  64.     @Override  
  65.     public void writeToParcel(Parcel dest, int flags) {  
  66.         // TODO Auto-generated method stub  
  67.         dest.writeString(user_name);  
  68.         dest.writeInt(user_age);  
  69.         dest.writeInt(user_sex);  
  70.         dest.writeInt(user_addr);  
  71.     }  
  72.       
  73.       
  74.       
  75. }</span><span style="font-size:12px;">  
  76. </span>  
可以看到自定义类实现了Parcelable接口, Parcelable需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义(这里我遇到过问题,就是变量写入的数序一定要跟读取的数序一样,否则程序会崩溃,实际上Parcelable底层就是按顺序转成二进制码存储,读取的),而序列化的这些操作完全由底层实现,其中CREATOR用来创建自定义的Parcelable的对象.

接下来就是如何使用了:

MainActivity中,就放了一个button

[java] view plain copy
  1. public class MainActivity extends Activity {  
  2.   
  3.     private Context context;  
  4.       
  5.     private Button button;  
  6.       
  7.     private UserBean userBean;  
  8.       
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13.         context=this;  
  14.           
  15.         button=(Button) findViewById(R.id.btn);  
  16.           
  17.         userBean=new UserBean();  
  18.         userBean.setUser_name("影魔");  
  19.         userBean.setUser_age(3);  
  20.         userBean.setUser_sex(1);  
  21.         userBean.setUser_addr("帝都");  
  22.           
  23.         button.setOnClickListener(new OnClickListener() {  
  24.               
  25.             @Override  
  26.             public void onClick(View v) {  
  27.                 // TODO Auto-generated method stub  
  28.                 Intent intent=new Intent();  
  29.                 Bundle bundle=new Bundle();  
  30.                 bundle.putParcelable("user", userBean);  
  31.                 intent.setClass(context, OtherActivity1.class);  
  32.                 intent.putExtra("bundle", bundle);  
  33.                 context.startActivity(intent);  
  34.             }  
  35.         });  
  36.       
  37.     }  
  38.   
  39. }  
OtherActivity中,就放了一个textView

[java] view plain copy
  1. public class OtherActivity1 extends Activity {  
  2.   
  3.     private TextView tv;  
  4.       
  5.     private UserBean userBean;  
  6.       
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_other1);  
  12.           
  13.         tv=(TextView) findViewById(R.id.tv);  
  14.           
  15.         Bundle bundle=(Bundle) getIntent().getExtras().get("bundle");  
  16.         userBean=(UserBean) bundle.getParcelable("user");  
  17.           
  18.         tv.setText("name:"+userBean.getUser_name()+",age:"+userBean.getUser_age()+  
  19.                 ",sex:"+userBean.getUser_sex()+",addr:"+userBean.getUser_addr());  
  20.     }  
  21.   
  22. }  
0 0