グローバル変数というものは存在せず、Activity間でデータの受渡しをするには工夫が必要です。
この記事ではAndroidアプリ開発において、
複数のActivity間を跨ってプログラム全体でデータを受渡しする方法を記載します。
=== 目次 ===
複数のAcitivy間を跨いでデータの受渡しをする方法
複数のAcivity間を跨ったデータ受渡し方法には以下の3通りがあります。- ① Intentにおけるデータ受渡しを利用する
- ② Application継承クラスを作成する
- ③ ローカルデータの保存/読込を利用する
① Intentにおけるデータ受渡しを利用する
まず1つ目はIntentにおけるデータ受渡しを利用する方法です。やり方はIntentにputExtraでキーと値を代入してからActivityを呼び出します。
次に呼び出されたActivityでgetExtraメソッドにてそのキーを指定して値を読み出します。
この方法のデメリットは以下です。
- 受け渡せる変数型が限られる
- 受け渡すデータの数が増えるのに比例してコードが複雑になる。
サンプルコード
以下がサンプルコードです。MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, SubActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
}
}
SubActivity.javapublic class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Intent intent = getIntent();
String str = intent.getStringExtra("key"); //valueが代入される
}
}
② Application継承クラスを作成する
私が一番好きな方法がこのApplication継承クラスを作成する方法です。AndroidアプリにおいてはApplicationクラスのオブジェクトが必ず一つ保持されており、アプリのどこからでもアクセスすることが可能です(正確にはContextオブジェクトが存在してさえいればアクセス可能)。
よって、Application継承クラスを作成し、
もとのApplicationクラスオブジェクトと置き換えれば、
Androidアプリのどこからでもアクセス可能な変数を持たせることが可能です。
さらにArrayListや自作クラスオブジェクトなどといった任意のオブジェクトをやり取りすることが可能です。
Application継承クラスを作る
以下がApplication継承クラスの作成例です。ここではgetter/setterを実装していますが、public指定してグローバル変数のように使用しても良いです。
Common.java
public class Common extends Application {
private boolean IsOptionEnable = false;
@Override
public void onCreate() {
super.onCreate();
}
boolean getIsOptionEnable() { return IsOptionEnable; }
void setIsOptionEnable(boolean value) { IsOptionEnable = value; }
}
AndroidManifest.xmlにおいて作成した継承クラスを登録する
次にAndroidManifest.xmlにおいて、作成したApplicaiton継承クラスを登録します。
以下がその例です(android:nameの箇所です)。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.areseiproject">
<application
android:name=".Common"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
使用方法の例
最後に使用例です。ActivityのonCreateなどでApplication継承クラスのオブジェクトを取得します。
オブジェクトを取得するためには、
getApplication()でApplicationオブジェクトを取得し、キャストさせます。
MainActivity.java
public class MainActivity extends AppCompatActivity {
Common c;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
c = (Common)getApplication();
c.setIsOptionEnable(true);
}
}
③ローカルデータの保存/読込を利用する
最後にローカルデータの保存/読込を利用する方法です。Activity間だけでなく、不揮発として保存したい場合はこの方法を使うのが良いでしょう。
ローカルデータの保存/読込については、おおまかには以下の3通りの方法があります。
- SharedPreferenceを利用する
- SQLiteデータベースを利用する
- Streamを用いて自前で実装する
まとめ
この記事ではActivity間を跨ってデータをやり取りする方法を3つ紹介しました。単純にグローバルな変数を持ちたいだけの場合は、
①と③については以下のようなデメリットがあるため、
②のApplicatin継承クラスを作成する方法をオススメします。
- ①Intentにおけるデータ受渡し
- 受け渡せるオブジェクトが限られる(※)
- 受渡しをしたいデータの数と比例してコードが増える
- ③ローカルデータ保存:
- 受け渡せるオブジェクトが限られる(※)
- 不揮発として保存したい訳ではない場合はコードが複雑になるだけ
- Streamで自前で実装した場合には例外を徹底的に実装する必要がある
しかし、コードが複雑になるだけなので、
やはり②のApplication継承クラスを作成する方法がオススメです。