【Android】Activity間でデータの共有 ->Applicationクラスの使い方
各アクティビティ間でデータを共有したい時は通常
- Serializableインターフェイスを実装してIntent を使う
-> 確かプリミティブな型しか渡せなかったような気がする。
- Parcelableインターフェイスを実装してIntentを使う
-> オリジナルな型も渡せるけど実装がめんどくさかった気がする。
の方法がある。
だけど、双方とも実装がわかりづらいのと、
参照渡しが確か出来ないので受け渡し元で値が更新されるようなデータの共有には向いていない気がする。
そこでApplicationクラスを継承したデータ共有用のクラスを作成。
グローバル変数のように使えるので全体の見通しも良く使いやすくてGood.
使い方
Applicationクラスを実装したクラス
1. Applicationクラスを継承する
2. メンバーに共有する変数を宣言
3. onTerminateをオーバーライドする。
4. メンバーにアクセスするような関数を定義する。
参考例はこちら
public class MyApplication extends Application { private final String TAG = this.getClass().getName(); public HashMap<String, Double> sensor_data = new HashMap<String, Double>(); @Override public void onCreate() { super.onCreate(); sensor_data.put("SAMPLINGTIME", 0.0); sensor_data.put("ACC_X", 0.0); sensor_data.put("ACC_Y", 0.0); sensor_data.put("ACC_Z", 0.0); } @Override public void onTerminate() { super.onTerminate(); } /* * メンバーにデータをセットするためのメソッド */ public void setObj(String key, Double value){ sensor_data.put(key, value); } /* * メンバーからデータを取得するためのメソッド */ public double getObj(String key){ return sensor_data.get(key); } }
Applicationクラスにアクセスするクラス
1. this.getApplication() を実行してAppクラスが使用できるようにする。
2. Appクラスで定義したデータアクセス用のメソッド等を用いてデータにアクセスする。
参考例はこちら
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // このActivityを画面に表示 setContentView(R.layout.activity_sdc_can_disp); // 受信データを格納しているAppクラスを使用できるようにする myapp = (MyApplication)this.getApplication(); latestdata = new HashMap<String, Double>(); // データを取得 data = myapp.getObj("SDC_FACTOR_FL");