本篇博文主要记录了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;
}
};
}