Intentでオブジェクトを渡す


本ブログでも以下の記事にて紹介していますが、Androidには、Intentという強力なAPIが用意されています。

Intentを使って画面を遷移する(明示的Intent)
Intentを使ってアプリを連携させる(暗黙的Intent)

Intentを用いることで、異なったActivity間でデータ(文字列や数値など)を受け渡すことが可能です。
今回はこのIntentを用いて、オブジェクトを受け渡す方法を解説します。

Intentでオブジェクトを受け渡し可能にするには、少し工夫が必要です。
ポイントは、java.io.Serializableインタフェースimplementsすることで、受け渡すオブジェクト(クラス)をシリアライズする点です。
シリアライズについては、以下の記事も参考にしてみてください。

データを簡単に保存する方法(シリアライズ編)

今回は、英語、数学、理科、社会のテストの点数を格納したクラスのオブジェクトを渡し、受け側で情報を取り出して表示させるサンプルを例に解説します。

それでは続きをどうぞ

受け渡し対象のクラスの作成

まずは今回受け渡す対象となるオブジェクトを生成するためのクラスを作成します。
オブジェクトをIntentで受け渡しする際には、入出力ストリームにて入出力が可能となるように、オブジェクトをシリアライズ(直列化)によって連続的なバイト列にする必要があります。オブジェクトはメモリ上に連続して配置されているとは限らないからです。
よって、前述した通り、受け渡し対象となるオブジェクトのクラスは、java.io.Serializableインタフェースをimplementsしている必要があります。
java.io.Serializableインタフェースについては、データを簡単に保存する方法(シリアライズ編)で詳しく解説されてますので、ここでは詳しく解説しませんが、今回は以下のようなクラスを作成しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class TestResults implements Serializable {
 
    int english = 0;
    int mathematics = 0;
    int scientics = 0;
    int society = 0;
 
    enum subject{
        ENGLISH,
        MATHEMATICS,
        SCIENTICS,
        SOCIETY;
    }
 
    public TestResults(int eng, int math, int science, int social) {
        english = eng;
        mathematics = math;
        scientics = science;
        society = social;
    }
 
    public int getPoint(subject sub){
        switch(sub){
            case ENGLISH: return english;
            case MATHEMATICS: return mathematics;
            case SCIENTICS: return scientics;
            case SOCIETY: return society;
            default : return -1;
        }
    }
}

コンストラクタで引数に渡されてきたint型の整数を保持し、getPoint()メソッドで保持した値を取得するシンプルなクラスです。
java.io.Serializableインタフェースをimplementsしている以外は特に特殊なところはありませんね。(ぶっちゃけここまでで解説はほとんど終了しています。。。

オブジェクトを受け渡す

それでは先ほど作成したクラスのインスタンス(オブジェクト)を生成し、Intentを用いて受け渡してみましょう。
まずは渡す側の処理です。TestResultsオブジェクト生成時に、引数に各テストの点数を順番に指定して、値をTestResultsクラス内のコンストラクタ内部で保持します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ObjectIntentSample extends Activity {
(...中略...)
        Button saveBtn = (Button)findViewById(R.id.save);
        saveBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                (...中略...)
                TestResults tr = new TestResults((int)engPnt,(int)mathPnt,(int)sciencePnt,(int)socialPnt);
 
                Intent objIntent = new Intent(getApplicationContext(),RecieveActiviity.class);
                objIntent.putExtra("test_result",tr);
                startActivity(objIntent);
    }
}

渡す側のActivityでは、putExtra()メソッドを用いてIntentに生成したTestResultsクラスのオブジェクトを付加します。特に変わった様子はありません。

次は受け取る側の処理です。

1
TestResults tr = (TestResults)getIntent().getSerializableExtra("test_result");

Intentからシリアライズされたオブジェクトや値を取り出す場合は、 getSerializableExtra()メソッドを使用します。引数には、putExtra()の第1引数で指定したキーを指定します。

あとは受け取ったオブジェクトから値を取り出すだけです。

1
2
3
4
5
6
7
8
9
10
public class RecieveActiviity extends Activity {
(...中略...)
    TestResults tr = (TestResults)getIntent().getSerializableExtra("test_result");
 
    eng.setText(String.valueOf(tr.getPoint(subject.ENGLISH)));
    math.setText(String.valueOf(tr.getPoint(subject.MATHEMATICS)));
    science.setText(String.valueOf(tr.getPoint(subject.SCIENTICS)));
    social.setText(String.valueOf(tr.getPoint(subject.SOCIETY)));
(...中略...)
}

今回のサンプルでは取り出したデータをテキストビューでシンプルに表示しています。

以上で、オブジェクトの受け渡しは無事完了です。簡単ですね。オチもありません。

One Comment