アクティビティなどに自作のクラスを渡す方法

あるアクティビティから別のアクティビティを起動する際に引数を渡す場合があります。そのときintなどのプリミティブ型以外の自作のクラスを渡すには次の2つの方法があります。

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を実装したときはdescribeContentwriteToParcelメソッドをオーバーライドします。

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の違い

どちらも自作したクラスに実装してアクティビティ間でクラスを受け渡しできるという役割がありますが、少し違いがあります。それは次のような違いです。

以上ような違いが2つの間にはあります。

2つめの違いにあるようにあるアプリから画像ビューワーアプリに画像を渡したりするときなどはParcelableを実装し、それ以外の同じアプリ内のアクティビティ間でのクラスの受け渡しだけならSerializableを実装するといったように使い分けしたほうが良さそうです。

関連項目
プライバシーポリシー