1. 程式人生 > >Android Activity跳轉傳遞序列化實體類物件

Android Activity跳轉傳遞序列化實體類物件

       我發現自己真的好菜,想學點知識,可是不知道從何下手,今天一天狀態確實很不好。實在無聊,寫點以前遇到過的問題,方便以後用到時檢視,更希望能與別人分享。

       本篇部落格實現Android activity跳轉的時候攜帶我自定義的實體類

       Bundle給我們提供了一個putParcelable(key,value)的方法。專門用於傳遞序列化物件。同樣如果我們想傳遞一個list<實體類>,只要在bundle呼叫putParcelableArrayList(key, value)即可,當然list裡的物件要序例化!

 話不多說,上程式碼:

package com.weiwend.wj.testactivity;

import android.os.Parcel;
import android.os.Parcelable;

public class UserBean implements Parcelable{

	private String user_name;
	private int user_age;
	private int user_sex;
	private int user_addr;
	
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public int getUser_age() {
		return user_age;
	}
	public void setUser_age(int user_age) {
		this.user_age = user_age;
	}
	public int getUser_sex() {
		return user_sex;
	}
	public void setUser_sex(int user_sex) {
		this.user_sex = user_sex;
	}
	public int getUser_addr() {
		return user_addr;
	}
	public void setUser_addr(int user_addr) {
		this.user_addr = user_addr;
	}
	
	public static final Parcelable.Creator<UserBean> CREATOR=new Creator<UserBean>() {
		
		@Override
		public UserBean createFromParcel(Parcel source) {
			UserBean bean=new UserBean();
			
			bean.user_name=source.readString();
			bean.user_age=source.readInt();
			bean.user_sex=source.readInt();
			bean.user_addr=source.readInt();
			
			return bean;
		}
		
		@Override
		public UserBean[] newArray(int size) {
			// TODO Auto-generated method stub
			return new UserBean[size];
		}
	};
	
	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// TODO Auto-generated method stub
		dest.writeString(user_name);
		dest.writeInt(user_age);
		dest.writeInt(user_sex);
		dest.writeInt(user_addr);
	}
	
	
	
}</span><span style="font-size:12px;">
</span>
可以看到自定義類實現了Parcelable介面, Parcelable需要實現writeToParcel、describeContents函式以及靜態的CREATOR變數,實際上就是將如何打包和解包的工作自己來定義(這裡我遇到過問題,就是變數寫入的數序一定要跟讀取的數序一樣,否則程式會崩潰,實際上Parcelable底層就是按順序轉成二進位制碼儲存,讀取的),而序列化的這些操作完全由底層實現,其中CREATOR用來建立自定義的Parcelable的物件.

接下來就是如何使用了:

MainActivity中,就放了一個button

public class MainActivity extends Activity {

	private Context context;
	
	private Button button;
	
	private UserBean userBean;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context=this;
		
		button=(Button) findViewById(R.id.btn);
		
		userBean=new UserBean();
		userBean.setUser_name("影魔");
		userBean.setUser_age(3);
		userBean.setUser_sex(1);
		userBean.setUser_addr("帝都");
		
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent=new Intent();
				Bundle bundle=new Bundle();
				bundle.putParcelable("user", userBean);
				intent.setClass(context, OtherActivity1.class);
				intent.putExtra("bundle", bundle);
				context.startActivity(intent);
			}
		});
	
	}

}
OtherActivity中,就放了一個textView
public class OtherActivity1 extends Activity {

	private TextView tv;
	
	private UserBean userBean;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other1);
		
		tv=(TextView) findViewById(R.id.tv);
		
		Bundle bundle=(Bundle) getIntent().getExtras().get("bundle");
		userBean=(UserBean) bundle.getParcelable("user");
		
		tv.setText("name:"+userBean.getUser_name()+",age:"+userBean.getUser_age()+
				",sex:"+userBean.getUser_sex()+",addr:"+userBean.getUser_addr());
	}

}
再看一下執行效果吧。(哈哈,突出一個醜)