Android高手之路之Android中Intent传递对象的两种方法Serializable,Parcelable

注:本文改编自Android_Tutor的文章,原文地址:http://blog.csdn.net/android_tutor/article/details/5740845

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);  
	    } 
}








本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
估计很多码友都遇到过这样的情况: UIButton在某些情况下不能立刻响应TouchDown事件,换句话说, 迅速点击 按钮时,你是永远看不见这个按钮的高亮状态的。 而你会发现,出现这种情况时,这些按钮都在UIScrollView(UITableView)上。 为此我用了一下午时间查贴整理,得到了完美的解决方案。 在介绍解决方案前,必须先科普一些事实,帮助大家理解: UIScrollView: 1、属性 delaysContentTouches ,布尔类型,默认值为YES。值为YES时,UIScrollV

iOS开发ARC内存管理技术要点 - 2015-04-07 14:04:23

本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节。这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验。详细的关于ARC的信息请参见苹果的 官方文档 与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器
原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 《霍比特人3-五军之战》结尾是什么样子的? 主角的图片播放fade in fade out动画 在1过程中fade in时图片略有放大 图片上面有文字,文字无动画(这里涉及到素材的准备,图片,文字等,这一点先忽略) 非动画元素,背景音乐,《The Last Goodbye》 思路 fade in fade out动画,cocos的场景切换动画TransitionCrossFade和这个效果比较相符 背景音乐播放不难,参考官方文档 fade
环境:服务器:apache服务器,openssl。            客户端:PC、java平台、android平台。 思路: 1、先搞定ssl单向验证,再解决双向。 2、先PC,再java平台,再android,不一定非得这样,自由选择,个人是为了弄清整个流程,多走了些路。 过程步骤: 1、在pc上用apache搭建了一个http服务器,用openssl建立自签名的CA证书ca.crt,签发服务器证书server.crt,签发客户端证书client.crt。(apache+openssl配置ssl通

ios网络请求3840错误的问题 - 2015-04-07 14:04:09

ios网络请求3840错误的问题 by 伍雪颖 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unterminated string around character 11080.) UserInfo=0x171065d00 {NSDebugDescription=Unterminated string around character 11080.
在strings中添加u/u的标签就行了 如下所示: string name="login_text_forget_pwd"u忘记密码/u/string 效果如下
android开发中遇到的问题【一】 一。在一个xml中能否使用同一个include多次 http://www.apkbus.com/android-104152-1-1.html android中include标签的使用 http://blog.csdn.net/wangljgood/article/details/6556175 ​二 android button在 linerlayout中底部居中 把button外的权重设为1.0 三。button shape http://www.cnblogs.
New UI-布局之FrameLayout(帧布局)详解  ——转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途! 小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的 力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文 更加的详尽,帮到更多的人,O(∩_∩)O谢谢! 小猪Android开发交流群: 小猪Android开发交流群 群号: 421858269 新Android UI实例大全目录: http://blo

Swift教程之运算符重载 - 2015-04-07 11:04:03

原文地址:http://www.raywenderlich.com/80818/operator-overloading-in-swift-tutorial 作者:Corinne Krych  译者:孟祥月 blog:http://blog.csdn.net/mengxiangyue 这篇文章是本人第一次翻译,难免有错误,翻译的时候使用的是txt,所以格式上面有些不太好。 在早前的IOS 8盛宴系列的教程里,你已经了解到,Swift提供了许多强大的、现代的编程特性,比如泛型、函数式编程、一等类型(firs

ionic框架环境配置 - 2015-04-07 11:04:03

参考文章 Cordova 3.x 基础(1) -- 环境搭建(Windows / Android) http://rensanning.iteye.com/blog/2016364 phoneGap 之 Android 环境搭建  http://haomou.net/2014/08/06/2014_phonegap_android/ ionic 框架配置  http://haomou.net/2014/08/07/2014_ionic/ ant 的配置  http://www.cnblogs.com/yu