アクティビティなどに自作のクラスを渡す方法
あるアクティビティから別のアクティビティを起動する際に引数を渡す場合があります。そのときintなどのプリミティブ型以外の自作のクラスを渡すには次の2つの方法があります。
- 自作クラスにParcelableを実装する
- 自作クラスにSerializableを実装する
2つのインターフェイスを実装した自作クラスの例
例えば次のようなクラスがParcelableクラスを実装したクラスです。
class MyClass implements Parcelable { private int i = 100; public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() { @Override public MyClass createFromParcel(Parcel source) { return null; } @Override public MyClass[] new Array(int size) { return null; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel pr, int flag) { pr.writeInt(i); } private MyClass(Parcel in) { i = in.readInt(); } }
メンバ変数に1つのint型を持っています。また、Parcelableを実装したときはdescribeContentとwriteToParcelメソッドをオーバーライドします。
Parse型を引数に持つコンストラクタも作ります。
そして次のクラスがSerializableを実装したクラスです。
class MyClass implements Serializable { private static final long serialVersionUID = 1L; private int i = 100; }
serialVersionUIDという変数があります。これはクラスに変更があった場合でも同一のクラスだと識別するための番号です。ここでは標準の1にしています。
Parcelableとは違いこのクラスにはオーバーライドする関数はありません。
自作クラスの渡し方
この2つのインターフェイスのどちらかを実装したクラスをアクティビティ間で渡すには次のようなコードを書きます。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, SecondActiviy.class); intent.putExtra("MY_CLASS_KEY", new MyClass()); startActivity(intent); } }
MyClassはSerializableまたはParcelableを実装しているクラスです。それをIntentインスタンスにputExtarメソッドを使って渡しています。
送信されたIntentを受け取ったアクティビティで自作クラスを受け取るには次のコードを書きます。
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_activity); MyClass my_class = getIntent().getParcelableExtra(); //もしSerializableを実装しているなら //MyClass my_class = (MyClass)getIntent().getSerializableExtra() //を使う。 } }
SerializableとParcelableの違い
どちらも自作したクラスに実装してアクティビティ間でクラスを受け渡しできるという役割がありますが、少し違いがあります。それは次のような違いです。
- Serializable
javaで広く利用されている
異なるアプリ間では使えない
serialVersionUIDをつける以外は何もしなくて良い
- Parcelableクラス
AndroidのAPI内でしか使えない
異なるアプリ間(アプリから他のアプリを起動する場合)でも受け渡しが可能
オーバーライドするメソッドがあるのでコード量が多くなる。
以上ような違いが2つの間にはあります。
2つめの違いにあるようにあるアプリから画像ビューワーアプリに画像を渡したりするときなどはParcelableを実装し、それ以外の同じアプリ内のアクティビティ間でのクラスの受け渡しだけならSerializableを実装するといったように使い分けしたほうが良さそうです。