2013年8月13日火曜日

android:複数のアクティビティでデータを共有する

アクティビティ間でのデータのやりとりはインテントを使用すれば可能であるが、
そのデータが共有データである場合、画面が遷移するたびにインテントにput、getを繰り返すのは効率がよくない。
そこで、すべてのアクティビティから参照できるよう、Singletonでデータを保持する方法を試してみる。

  • 共有するデータクラスをSingletonで作成する。
  • 共有データが必要なアクティビティにて、getInstanceでインスタンスを取得する。

共有するデータクラスは以下のように定義する。
package net.kuttya.singletonsample;

public class SampleData {
    // 共有するデータクラス

    // 自クラスをインスタンスに持つ
    private static SampleData data = null;

    // メンバ変数
    private int dataInt = 0;

    public static SampleData getInstance() {
        if(data == null) {
            // インスタンスがnullの場合のみ生成する
            data = new SampleData();
        }
        return data;
    }

    private SampleData() {
        // コンストラクタをprivateにすることで、
        // インスタンスを新しく生成できなくする
    }

    public void setDataInt(int i) {
        this.dataInt = i;
    }

    public int getDataInt() {
        return this.dataInt;
    }
}

呼び出し元のアクティビティでは、次の動作を実装する。
package net.kuttya.singletonsample;

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 = SampleData.getInstance();
                data.setDataInt(12345);

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

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

呼び出し先のアクティビティでは、次の動作を実装する。
package net.kuttya.singletonsample;

import android.app.Activity;
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);

        // 共有データを取得
        SampleData data = SampleData.getInstance();

        // 表示
        TextView textView1;
        textView1 = (TextView) findViewById(R.id.textView1);
        textView1.setText(Integer.toString(data.getDataInt()));
    }
}

ただし、データの共有がうまくいかないケースもある。
例えば、アクティビティ単位でプロセスを分けた場合、
Singletonであったとしても、それぞれのプロセスでインスタンスが生成されてしまう可能性がある。
他にも、共有するデータにキャッシュ情報が含まれていたりすると、
キャッシュがなにかのきっかけでクリアされてしまった場合、
共有データないのキャッシュ情報には参照先が存在しなくなる。

保持するデータには注意が必要である。

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

0 件のコメント:

コメントを投稿