
データ共有の方法
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への登録です。アプリケーションクラスはとても便利で、扱いやすいので使ってみてください。
ただし常に端末にデータを保存しておくべきデータ(設定データなど)についてはなどはアプリケーションクラスを用いず、プリファレンスを用いることをおすすめします。