Android中Intent传递对象的两种方法Serializable,Parcelable

所属分类: 软件编程 / Android 阅读数: 1964
收藏 0 赞 0 分享

Android中的传递有两个方法,一个是Serializable,另一个是Parcelable。

Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。

二者的使用场景和区别:

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

Serializable接口实现比较简单,只要实现setter和getter,就可以了。

而Parcelable实现比较麻烦些。用一个小的demo来说明:

1.新建android项目ObjectTranDemo

2.创建一个entity的javaBean:Person.java.实现Serializable接口

package com.example.objecttrandemo; 
import java.io.Serializable; 
public class Person implements Serializable { 
private static final long serialVersionUID = -7060210544600464481L; 
private String name; 
private int age; 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public int getAge() { 
return age; 
} 
public void setAge(int age) { 
this.age = age; 
} 
}

3.创建主界面activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="android object trance" 
/> 
<Button 
android:id="@+id/button1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="Serializable" 
/> 
<Button 
android:id="@+id/button2" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="Parcelable" 
/> 
</LinearLayout>

4.创建主activity。这个activity主要用来响应点击事件,和传递数据。ObjecttranDemo.java:

package com.example.objecttrandemo; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
public class ObjectTranDemo extends Activity implements OnClickListener{ 
private Button sButton,pButton; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
setupViews(); 
} 
//initial the views 
public void setupViews(){ 
sButton = (Button)findViewById(R.id.button1); 
pButton = (Button)findViewById(R.id.button2); 
sButton.setOnClickListener(this); 
pButton.setOnClickListener(this); 
} 
//Serializeable object trance 
public void SerializeMethod(){ 
Person mPerson = new Person(); 
mPerson.setName("durant"); 
mPerson.setAge(25); 
Intent mIntent = new Intent(this,ObjectTranDemo1.class); 
Bundle mBundle = new Bundle(); 
mBundle.putSerializable("mPerson",mPerson); 
mIntent.putExtras(mBundle); 
startActivity(mIntent); 
} 
//Pacelable object trance 
public void PacelableMethod(){ 
Book mBook = new Book(); 
mBook.setBookName("a man from mars"); 
mBook.setAuthor("james"); 
mBook.setPublishTime(2014); 
Intent mIntent = new Intent(this,ObjectTranDemo2.class); 
Bundle mBundle = new Bundle(); 
mBundle.putParcelable("mBook", mBook); 
mIntent.putExtras(mBundle); 
startActivity(mIntent); 
} 
@Override 
public void onClick(View v) { 
if(v == sButton){ 
SerializeMethod(); 
}else{ 
PacelableMethod(); 
} 
} 
}

5.新建activity ObjectTranDemo1.java用来显示Serializable接口传递过来的数据

package com.example.objecttrandemo; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
public class ObjectTranDemo1 extends Activity{ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
TextView mTextView = new TextView(this); 
Person mPerson = (Person)getIntent().getSerializableExtra("mPerson"); 
mTextView.setText("You name is: " + mPerson.getName() + "\n"+ 
"You age is: " + mPerson.getAge()); 
setContentView(mTextView); 
} 
}

至此,Serializable接口传递数据完毕,对了,别忘了,在Mainfest.xml文件中声明新的activity

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.objecttrandemo" 
android:versionCode="1" 
android:versionName="1.0" > 
<uses-sdk 
android:minSdkVersion="8" 
android:targetSdkVersion="18" /> 
<application 
android:allowBackup="true" 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" 
android:theme="@style/AppTheme" > 
<activity 
android:name="com.example.objecttrandemo.ObjectTranDemo" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
<activity android:name=".ObjectTranDemo1"></activity> 
<activity android:name=".ObjectTranDemo2"></activity> 
</application> 
</manifest>

下面看Parcelable的传递:

实现Parcelable一般需要4个步骤:

1)implements Parcelable

2)重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据

3)重写describeContents方法,内容接口描述,默认返回0就可以

4)实例化静态内部对象CREATOR实现接口Parcelable.Creator

public static final Parcelable.Creator<T> CREATOR

注:其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话即可(return new T[size]),供外部类反序列化本类数组使用。

简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。

具体:

1.新建Book的实体类:

Book.java:

package com.example.objecttrandemo; 
import android.os.Parcel; 
import android.os.Parcelable; 
public class Book implements Parcelable{ 
private String bookName; 
private String author; 
private int publishTime; 
public String getBookName() { 
return bookName; 
} 
public void setBookName(String bookName) { 
this.bookName = bookName; 
} 
public String getAuthor() { 
return author; 
} 
public void setAuthor(String author) { 
this.author = author; 
} 
public int getPublishTime() { 
return publishTime; 
} 
public void setPublishTime(int publishTime) { 
this.publishTime = publishTime; 
} 
//Internal Description Interface,You do not need to manage 
@Override 
public int describeContents() { 
return 0; 
} 
//give some attention to the oder betwwen writeToParcel and createFromParcel 
@Override 
public void writeToParcel(Parcel parcel, int flags){ 
parcel.writeString(bookName); 
parcel.writeString(author); 
parcel.writeInt(publishTime); 
} 
public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { 
@Override 
public Book[] newArray(int size) { 
return new Book[size]; 
} 
@Override 
public Book createFromParcel(Parcel source) { 
Book mBook = new Book(); 
mBook.bookName = source.readString(); 
mBook.author = source.readString(); 
mBook.publishTime = source.readInt(); 
return mBook; 
} 
}; 
}

2.新建activity :ObjectTranDemo2.java.用来显示parcelable的数据:

package com.example.objecttrandemo; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
public class ObjectTranDemo2 extends Activity{ 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
TextView mTextView = new TextView(this); 
Book mBook = (Book)getIntent().getParcelableExtra("mBook"); 
mTextView.setText("Book name is: " + mBook.getBookName()+"\n"+ 
"Author is: " + mBook.getAuthor() + "\n" + 
"PublishTime is: " + mBook.getPublishTime()); 
setContentView(mTextView); 
} 
}

在上篇文章给大家介绍了,Intent传递对象之Serializable和Parcelable的区别,感兴趣的朋友可以点击了解详情。

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多