AndroidはIntentを使用してオブジェクトを渡す方法


以前の記事では、アクティビティの開始、ブロードキャストの送信、ヒントサービスなど、Intentの使い方を紹介し、Intentを使用してデータを渡すことができます.次のコードを示します.
Intent intent = new Intent(this,SecondActivity.class);
		intent.putExtra("info", "I am fine");
		startActivity(intent);

データを渡すときに使う方法はputExtraですが、サポートされているデータ型は限られていますが、どのようにオブジェクトを渡すのでしょうか?
Androidでは、Intentを使用してオブジェクトを渡すには、Serializableシーケンス化方式とParcelableシリアル化方式の2つの方法があります.
1、Serializable方式
このように、1つのオブジェクトを格納可能または転送可能な状態に変換し、シーケンス化されたオブジェクトはネットワーク上で転送することができ、ローカルに格納することができる.
オブジェクトのシーケンス化は、Serializableクラスを実装するだけです.
package com.example.testapplication;

import java.io.Serializable;

/**
 *      
 * @author yy
 *
 */
public class Emp implements Serializable {
	
	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;
	}
	
}
では、Intentはどのようにオブジェクトパラメータを渡しますか.APIを見て、次の方法を発見しました.
intent.putExtra(String name, Serializable value);
したがって、この方法を使用して、以下のように伝達される.
	Intent intent = new Intent(this,SecondActivity.class);
		intent.putExtra("obj", new Emp());
		startActivity(intent);
では、どのように取得しますか?次の方法を使用します.
Emp emp = (Emp) getIntent().getSerializableExtra("obj");
はこのようにしてEmpオブジェクトを取得した.
2、Parcelable方式
この方式の実現原理は,完全なオブジェクトを分解し,分解の各部分がIntentがサポートするデータ型であるようにすることである.例は次のとおりです.
package com.example.testapplication;

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

/**
 * Parcelable  
 * @author yy
 *
 */
public class Emp2 implements Parcelable{
	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;
	}
	
	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flag) {
		//  name
		dest.writeString(name);
		//  age
		dest.writeInt(age);
	}
	
	public static final Parcelable.Creator<Emp2> creator = new Creator<Emp2>() {
		
		@Override
		public Emp2[] newArray(int size) {
			return new Emp2[size];
		}
		
		@Override
		public Emp2 createFromParcel(Parcel source) {
			Emp2 emp2 = new Emp2();
			//                
			//  name
			emp2.name = source.readString();
			emp2.age = source.readInt();
			return emp2;
		}
	};
}
オブジェクトの転送:シーケンス化と同じ方法:
Intent intent = new Intent(this,SecondActivity.class);
		intent.putExtra("obj", new Emp2());
		startActivity(intent);
オブジェクトの取得:
		Emp2 emp2 = getIntent().getParcelableExtra("obj");

3、違い
Serializableはシーケンス化の際に大量の一時変数を発生させ,頻繁なGCを引き起こす.したがって、メモリを使用する場合、ParcelableクラスはSerializableよりも性能が高いので、Parcelableクラスを使用することをお勧めします.
Parcelableはデータをディスクに格納する場合に使用できません.Parcelableはデータの持続性が外部で変化している場合によく保証できないからです.Serializableは効率が低く、使用も提唱されていませんが、この場合はSerializableをお勧めします.
最後に、読むことをお勧めしますhttp://blog.csdn.net/yyywyr/article/details/38437939この文章.