Activity之间序列化传递Object

Activity之间可以通过Intent和Bundle跳转并传递数据,可以传递的数据类型包括基本数据类型,String以及实现了Parcelable接口或Serializable接口的Object(File实现了Serializable接口):

1.Serializable接口是java中定义实现的,无须重写任何方法,但序列化和反序列化的过程中会产生大量中间变量,占用较大的内存

2.Parcelable接口,是Google专门为Android序列化定制的,序列化过程需要重写writeToParcel(Parcel dest, int flag)方法,反序列化时需要实现一个Parcelable.create<T>的变量。

实现Parcelable接口进行序列化和反序列化:

package com.hust.andoirdStudy;

import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable
{

	public String name;
	public String birthPlace;
	public int age;
	public Bitmap icon;

	public Person()
	{ // 空的构造方法
	}

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

	@Override
	public void writeToParcel(Parcel dest, int flags)
	{ // writeToParcel负责讲this对象写入Parcel文件中
		dest.writeString(name);
		dest.writeString(birthPlace);
		dest.writeInt(age);
		icon.writeToParcel(dest, 0);
	}

	public static final Parcelable.Creator<Person> CREATE = new Creator<Person>()
	{// CREATE方法实现讲Parcel中序列化的对象反序列化为Object
		@Override
		public Person createFromParcel(Parcel source)
		{
			Person person = new Person();
			person.name = source.readString();
			person.birthPlace = source.readString();
			person.age = source.readInt();
			person.icon = Bitmap.CREATOR.createFromParcel(source);

			return person;
		}

		@Override
		public Person[] newArray(int size)
		{
			return new Person[size];
		}
	};

}

实现Serializable接口进行序列化和反序列化:

package com.hust.andoirdStudy;

import java.io.Serializable;

import android.graphics.Bitmap;

public class Person implements Serializable
{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	public String name;
	public String birthPlace;
	public int age;
	public Bitmap icon;

	public Person()
	{ // 空的构造方法
	}

}

实现了上面任意一种接口之后,便可以在两个Activity之间传递Object了:

/**
* 假设已经有一个存储数据的Person对象
*/
Person person = new Person();

发送方-Parcelable:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("personID", 1110); // 传递普通数据
// 传递实现了Parcelable接口的Object, 当然普通数据也可以放在Bundle中传递
Bundle bundle = new Bundle();
bundle.putParcelable("person", person);
intent.putExtras(bundle);
startActivity(intent);

接收方-Parcelable:

int personID = getIntent().getExtras().getInt("personID");
Person person = getIntent().getParcelableExtra("person");

发送方-Serializable:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("person", person);
startActivity(intent);

接收方-Serializable:

Person p = (Person) getIntent().getSerializableExtra("person");

[注意]

序列化的本质是将Object的属性信息按照一定的顺序(在Parcelable接口中,按照writeToParcel中写入的顺序)写入序列化文件,而在反序列化过程中按照之前的顺序读出,并创建赋值给一个新的Object,所以要求writeToParcel(Parcel, int)函数中Object属性写入的顺序一定要和Parcelable.Creator<T>中的createFromParcel(Parcel)中read的顺序一致,不然反序列化后得到的Object会有数据错乱的现象。

时间: 2024-10-19 18:12:13

Activity之间序列化传递Object的相关文章

两个activity之间怎么传递ArrayList&lt;HashMap&lt;String, Object&gt;&gt;

问题:两个activity之间怎么传递ArrayList<HashMap<String, Object>>,比如在跳转后的页面要得到构造器数据,可是在跳转后页面构造数据的话可能就会效率太慢导致页面跳转的时候出现黑屏现象,这样的话我们就会想在跳转前页面先得到数据,然后将ArrayList<HashMap<String, Object>>类型的数据传到另一个activity在构造适配器这样就不会出现因初始化页面时间太久而出现的黑屏现象了.但是问题出现了,怎么传递

Android activity之间数据传递和共享的方式之Application

1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream,或者LinkedList链表等等数据类型就不太好用. 2.利用static静态数据, public static成员变量: 3.基于外部存储的传输,File/Preference/Sqlite 如果要针对第三方应用需要Content Provider 4.基于IPC的通信机制 context 与Service之间的传输,如Activity与Serv

解析activity之间数据传递方法的详解

转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Intent--------boudle,extra用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等详细介绍下Intent机制Intent包含两部分:1 目的[action]-------要去到哪里去2 内容[category.data]----------路上带些什么,

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

android Activity之间数据传递 Parcelable和Serializable接口的使用

Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解释两种接口:1)实现Serializable接口是JavaSE本身就支持的.2)Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),除了基本类型外,只有实现了Parcelable接口的类才能

2016.02.20 学习笔记 数据在Activity之间的传递的情况

情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用Intent类putExtra()方法实现. 具体在Onclick方法中的样例代码如下: Intent i1=new Intent(this,SecondActivity.class); String Message=Edit1.getText().toString(); i1.putExtra("M

android 不同Activity之间数据传递

1. 传值Activity package mydemo.mycom.demo2; import android.content.Intent; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.

转-Activity之间数据传递之Intent数据传递

Intent意图 可用于Activity之间的数据传递,一般可分为下面两种情况,从当前Activity传递到目标Activity后有无返回值: 1.传递后无返回值的情况: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50    在起始Activity中,发送数据   

Android中activity之间如何传递Hashmap数据

我的使用场景是当一个页面需页面中的listview中的hashmap的数据时要另一个,就要用到了传递hashmap数据. 在发送方,我的代码是这样的: package cn.oddcloud.www.coffeestore.Test; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View;