複数のActivity間でデータを受渡しする方法(グローバル変数もどきを作成する方法) | Androidアプリ開発

※当サイトはアフィリエイト広告を利用しています。

Androidアプリにおいてはグローバル変数というものは存在せず、Activity間でデータの受渡しをするには工夫が必要です。

この記事ではAndroidアプリ開発において、複数のActivity間を跨ってプログラム全体でデータを受渡しする方法を記載します。
スポンサーリンク


複数のAcitivy間を跨いでデータの受渡しをする方法

複数のAcivity間を跨ったデータ受渡し方法には以下の3通りがあります。
  1. Intentにおけるデータ受渡しを利用する
  2. Application継承クラスを作成する
  3. ローカルデータの保存/読込を利用する
以降では上記の3通りの実装方法やデメリットについて記載します。

① 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.java
public 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クラスを継承した自作クラスを作成します。onCreateは必ずoverrideしてください。

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; }
}

ここではgetter/setterを実装していますが、変数を直接public指定してグローバル変数のように使用しても良いです。

AndroidManifest.xmlにおいて作成した継承クラスを登録する

次にAndroidManifest.xmlにおいて、作成したApplicaiton継承クラスを登録します。

以下がその例です(7行目の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>

使用方法の例

最後に使用例です。


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のonCreateなどでApplication継承クラスのオブジェクトを取得します。オブジェクトを取得するためには、getApplication()でApplicationオブジェクトを取得し、キャストさせます。

そして、取得したオブジェクト(上記の例だとc)からアプリ共通の変数にアクセスできます。

(上記の例ではMainActivityからApplicationオブジェクトを取得していますが、Contextさえ存在すればアプリのどこからでもApplicationオブジェクトは取得できます)

③ ローカルデータの保存/読込を利用する

最後にローカルデータの保存/読込を利用する方法です。Activity間だけでなく、不揮発として保存したい場合はこの方法を使うのが良いでしょう。

ローカルデータの保存/読込については、おおまかには以下の3通りの方法があります。
  1. SharedPreferenceを利用する
  2. SQLiteデータベースを利用する
  3. Streamを用いて自前で実装する
各種ローカルデータ保存方法の比較は以下の記事にまとめていますので、そちらを参照願います。

各方法の比較

この記事ではActivity間を跨ってデータをやり取りする方法を3つ紹介しました。

単純にグローバルな変数を持ちたいだけの場合は、①と③については以下のようなデメリットがあるため、②のApplicatin継承クラスを作成する方法をオススメします。
  • ①Intentにおけるデータ受渡し
    • 受け渡せるオブジェクトが限られる(※1)
    • 受渡しをしたいデータの数に比例してコードが複雑になる
  • ③ローカルデータ保存:
    • 受け渡せるオブジェクトが限られる(※1)
    • 不揮発として保存したい訳ではない場合はコードが複雑になるだけ
    • Streamなどの例外処理や終了処理を実装する必要がある
※1…以下の記事で紹介しているGsonを利用すれば自作クラスオブジェクトなどを文字列として保存可能です。しかし、コードが複雑になるだけなので、やはり②のApplication継承クラスを作成する方法がオススメです。

まとめ

この記事ではAndroidアプリ開発において複数のActivity間を跨ってプログラム全体でデータを受渡しする方法を紹介しました。