2013年8月12日月曜日

android:Parcelableインタフェースを使用したアクティビティ間のデータ受け渡し

androidでは、プロセス間通信が頻繁に行われる。
特に、アクティビティ間でデータをやりとりする場合にはインテントを利用する。
インテントでインスタンスをやりとりする場合は、一工夫必要である。

インスタンスはintなどの型とはことなり、なんでもインテントにputすることはできない。
インテントにインスタンスを受け渡すためには、Parcelableインタフェースを実装する必要がある。

Parcelableインタフェースを利用するには、以下の手順が必要となる。
  • インテントに受け渡すクラスにParcelableを実装する。
  • インテントに受け渡すクラスでCREATORメンバ変数を定義する。
  • 受け渡し元のアクティビティにおいて、インテントにはParcelableを実装したクラスのインスタンスをputする。
  • 受け渡し先のアクティビティにおいて、同様にインテントにはParcelableを実装したクラスのインスタンスにgetする。
受け渡しするデータクラスは以下のように定義する。
package net.kuttya.parcelablesample;

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

public class SampleData implements Parcelable {
    // インテントで受け渡しするデータクラス

    public String sampleString;
    public int sampleInt;
    public int[] sampleIntArray;

    public int describeContents() {
     // ファイルディスクリプタを返す(Parcelableインタフェースの実装メソッド)
        // ファイルディスクリプタを持たない場合は0を返す
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        // シリアライズ処理(Parcelableインタフェースの実装メソッド)

        dest.writeString(sampleString);
        dest.writeInt(sampleInt);
        dest.writeIntArray(sampleIntArray);
    }

    public static final Parcelable.Creator CREATOR =
            new Parcelable.Creator() {

                public SampleData createFromParcel(Parcel source) {
                    // デシリアライズ処理
                    // writeToParcelメソッドでシリアライズした順番と同じ順番でメンバ変数をデシリアライズすること

                    // インスタンス生成
                    SampleData data = new SampleData();

                    // インスタンスに受け取るデータを格納する
                    data.sampleString = source.readString();
                    data.sampleInt = source.readInt();

                    // 配列の場合は、引数に格納先を指定する
                    data.sampleIntArray = new int[data.sampleInt];
                    source.readIntArray(data.sampleIntArray);

                    return data;
                }

                public SampleData[] newArray(int size) {
                    // 配列を受け渡す処理

                    return new SampleData[size];
                }
            };
}

受け渡し元のアクティビティでは、次の動作を実装する。
package net.kuttya.parcelablesample;

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 MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button)findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // シリアライズするインスタンスを生成
                SampleData data = new SampleData();
                data.sampleString = "abcde";
                data.sampleInt = 3;
                data.sampleIntArray = new int[data.sampleInt];
                data.sampleIntArray[0] = 123;
                data.sampleIntArray[1] = 456;
                data.sampleIntArray[2] = 789;

                // インテント生成
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setClassName("net.kuttya.parcelablesample", "net.kuttya.parcelablesample.CallActivity");

                // データをシリアライズ
                intent.putExtra("data", data);

                // アクティビティ呼び出し
                startActivity(intent);
            }
        });
    }
}

受け渡し先のアクティビティでは、次の動作を実装する。
package net.kuttya.parcelablesample;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class CallActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_call);

        // インテント取得
        Intent intent = getIntent();

        //データをデシリアライズして受け取る
        SampleData data = intent.getParcelableExtra("data");

        // 表示
        TextView textView1,textView2,textView3;
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);
        textView3 = (TextView) findViewById(R.id.textView3);
        textView1.setText(data.sampleString);
        textView2.setText(Integer.toString(data.sampleInt));
        textView3.setText(Integer.toString(data.sampleIntArray[0]));
    }
}


にほんブログ村 IT技術ブログ Androidアプリ開発へ

0 件のコメント:

コメントを投稿