Activity間でのデータの共有 | Sharing data within activities | Android

スポンサーリンク

スポンサーリンク

データ共有の方法

Activity間でデータの受け渡しといえば、Intentを用いる方法がよくあげられます。

ただし、この方法は値の受け渡しをするだけですし、基本的に1対1の関係です。

またIntentはバックキー処理にうまく対応できません

今回の目的とするコードは、各Activityがアクセスをして取得、変更、共有することです。1対多の関係ですし、バックキーも気にせず実装できます。

アプリケーションクラス

その一つがアプリケーションクラス(グローバル変数)です。

まず、アプリケーションクラスを用意します。

今回はint型のデータ1つを共有します。

AndroidStudioでData.javaを作成し、以下を記述します。

public class Data extends Application {
    private int dataInt;
    public int getDataInt() {
        return dataInt;
    }
    public void setDataInt(int dataInt) {
        this.dataInt = dataInt;
    }
}

getterとsetterは、private int dataInt を右クリック → generate → getter and setter で簡単に作成できます。

さらに、このままでは使えませんので、manifestにnameとして登録します。

<application
    android:name="***.******.testactivity.Data" 
    android:allowBackup="true"

Activityでの設定

実際のActivityで扱う場合は以下のようにgetApplication()を用いて記述します。

public class MainActivity extends AppCompatActivity {
    private Data data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        data = (Data)getApplication();
    }
}

値の設定と読み込み

今回作成したアプリケーションクラスは「int型のdataInt」です。

値の設定は

data.setDataInt(100); //100を設定

読み込みは

data.getDataInt()

実際に使ってみます
まず、1つめのアクティビティとしてMainActivity

public class MainActivity extends AppCompatActivity {
    private Data data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        data = (Data)getApplication();
        data.setDataInt(100);
        Log.d("Log0","MainActivity onCreate"+data.getDataInt());

    }
    @Override
    protected void onResume(){
        super.onResume();
        Log.d("Log0","MainActivity onResume"+data.getDataInt());
        Intent intent = new Intent(this,SubActivity.class);
        startActivity(intent);
    }
}

2つめのアクティビティとしてSubActivity

public class SubActivity extends AppCompatActivity {
    private Data data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
        data = (Data)getApplication();
        Log.d("Log0","SubActivity"+data.getDataInt());
        data.setDataInt(data.getDataInt()+100);
    }
}

MainActivityのonCreate → onResume →IntentでSubActivityへ → onCreate → onResume

端末のバックキーを押せば、MainActivityのonResumeに戻ります。

ライフサイクルのおさらいを兼ねて。

以下のようなログが出力されます。

D/Log0: MainActivity onCreate100
D/Log0: MainActivity onResume100
D/Log0: SubActivity100
D/Log0: MainActivity onResume200
D/Log0: SubActivity200
D/Log0: MainActivity onResume300
D/Log0: SubActivity300

バックキーを押して一連の流れを確認してみてください。

行ったり来たりするにつれ、dataIntの値が100づつ増えてゆきます。

アクティビティが3つ、4つと増えても同じように値を取得・設定することができます。

実装の注意点

案外忘れがちなのがManifestへの登録です。アプリケーションクラスはとても便利で、扱いやすいので使ってみてください。

ただし常に端末にデータを保存しておくべきデータ(設定データなど)についてはなどはアプリケーションクラスを用いず、プリファレンスを用いることをおすすめします。