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