序列化 Activity之间进行数据传输 List<Object> Parcelable serializable两种方式

本篇博文主要记录了Activity之间的序列化传值,实现的方式有两种Parcelable和serializable.通过Activity的Intent类中的extras和辅助类Bundle进行传输。

图1-1 DEMO截图

主Activity:负责传输数据

package com.wqn.test.activity;
import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import com.wqn.test.R;
import com.wqn.test.domain.ArrayListSerializable;
import com.wqn.test.domain.Menu;
import com.wqn.test.domain.Person;

/**
 * 在两个Activity 之间进行 传输List<Object> 
 * @author admin
 *
 */
public class BundlerTransListObjectActvity extends Activity implements OnClickListener{

	private TextView serializable;
	private TextView parcelable;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initViews();
		initEvents();
	}
	
	private void initViews() {
		serializable = (TextView) findViewById(R.id.serialiable);
		parcelable = (TextView) findViewById(R.id.parcelable);
	}
	
	private void initEvents() {
		serializable.setOnClickListener(this);
		parcelable.setOnClickListener(this);
	}
	
	private void loadSerializableData(){
		ArrayListSerializable<Menu> menus = new ArrayListSerializable<Menu>();
		for (int i=0 ; i<10; i++) {
			Menu menu = new Menu();
			menu.setId((long)i);
			menu.setMenuName("菜单" + i);
			menus.add(menu);
		}
		Intent it = new Intent();
		it.setClass(this, ReceiverListObjectActivity.class);
		Bundle bundle = new Bundle();
		bundle.putSerializable("menus", menus);
		it.putExtra("which", "serializable");
		it.putExtras(bundle);
		startActivity(it);
	}
	
	private void loadParcelableData(){
		Person person = new Person();
		person.setId(new Random().nextLong());
		person.setName("personName");
		Intent it = new Intent();
		it.setClass(this, ReceiverListObjectActivity.class);
		Bundle bundle = new Bundle();
		bundle.putParcelable("person", person);
		it.putExtra("which", "parcelable");
		it.putExtras(bundle);
		startActivity(it);
	}

	@Override
	public void onClick(View v) {
		if (v ==  serializable) {
			loadSerializableData();
		} else if (v == parcelable) {
			loadParcelableData();
		}
	}
	
}

接受数据的activity:

package com.wqn.test.activity;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.wqn.test.domain.Menu;
import com.wqn.test.domain.Person;

/**
 * 接收传输过来的List<Object>
 * @author admin
 *
 */
public class ReceiverListObjectActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		String choice = getIntent().getExtras().getString("which");
		if(choice == null) {
			Toast.makeText(this.getApplicationContext(), "跳转过来的which为null", Toast.LENGTH_SHORT).show();
			return;
		}
		if (choice.equals("parcelable")) {
			receiveParcelableData();
		} else if (choice.equals("serializable")) {
			receiveSerializableData();
		}
	}
	
	@SuppressWarnings({ "unchecked", "unused" })
	private void receiveSerializableData(){
		Bundle bundle = getIntent().getExtras();
		ArrayList<Menu> menus = (ArrayList<Menu>) bundle.getSerializable("menus");
		Log.e("", menus.toString());
		Toast.makeText(this.getApplicationContext(), "menu:\n" + menus.toString(),Toast.LENGTH_SHORT).show();
		for (Menu menu : menus) {
			Log.e("Menu ID: ", menu.getId() + "\n");
			Toast.makeText(this.getApplicationContext(), "Menu ID: " + menu.getId() + "\n",Toast.LENGTH_SHORT).show();
			Log.e("Menu Name: ", menu.getMenuName() + "\n");
			Toast.makeText(this.getApplicationContext(), "Menu Name: " +  menu.getMenuName() + "\n",Toast.LENGTH_SHORT).show();
		}
	}
	
	@SuppressWarnings({ "unchecked", "unused" })
	private void receiveParcelableData(){
		Bundle bundle = getIntent().getExtras();
		Person person = (Person) bundle.getParcelable("person");
		Log.e("", person.toString());
		Toast.makeText(this.getApplicationContext(), "menu:\n" + person.toString(),Toast.LENGTH_SHORT).show();
		Log.e("Menu ID: ", person.getId() + "\n");
		Toast.makeText(this.getApplicationContext(), "Menu ID: " + person.getId() + "\n",Toast.LENGTH_SHORT).show();
		Log.e("Menu Name: ", person.getName() + "\n");
		Toast.makeText(this.getApplicationContext(), "Menu Name: " + person.getName()  + "\n",Toast.LENGTH_SHORT).show();
	}
	
	
}



数据存储的类:

1. 经过序列化后的ArrayList<Menu>类:其中实现了serializable接口的类,是通过serializable序列化的类型进行传输值,而parcelable接口就是通过序列化parcelable进行数据的传输。

package com.wqn.test.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

public class ArrayListSerializable<T> extends ArrayList<T> implements Serializable {

	public ArrayListSerializable() {
		super();
	}

	public ArrayListSerializable(Collection<? extends T> collection) {
		super(collection);
	}

	public ArrayListSerializable(int capacity) {
		super(capacity);
	}
	
	
}

package com.wqn.test.domain;

import java.io.Serializable;

public class Menu implements Serializable{

	private Long id;
	
	private String menuName;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getMenuName() {
		return menuName;
	}

	public void setMenuName(String menuName) {
		this.menuName = menuName;
	}
	
	
}
package com.wqn.test.domain;

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

public class Person implements Parcelable{

	private Long id;
	private String name ;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int describeContents() {
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeLong(id);
		dest.writeString(name);
	}
	
	public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
		
		@Override
		public Person[] newArray(int size) {
			return new Person[size];
		}
		
		@Override
		public Person createFromParcel(Parcel source) {
			Person person = new Person();
			person.setId(source.readLong());
			person.setName(source.readString());
			return person;
		}
	};

}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值