Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】シングルトンとグローバルコンテキストで配列を保存する方法

本記事では、Androidアプリ開発におけるシングルトンデザインパターンを活用して、配列データをグローバルコンテキストとともに保存する方法を解説します。

シングルトンパターンとは?

実装に入る前に、まずシングルトンデザインパターンの基本をおさらいしておきましょう。シングルトンとは、あるクラスのインスタンス生成をアプリ内で1つだけに制限するデザインパターンのことです。代表的な活用例としては、同時実行(並行処理)の制御や、アプリケーション全体からデータストアへ一元的にアクセスするための窓口を作成することが挙げられます。

今回のサンプルでは、int型の配列をシングルトンクラスに保存し、グローバルコンテキストを利用してその値を取得してToastで表示するところまでを行います。

実装手順

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    xmlns:tools = "https://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity"
    android:orientation = "vertical">
    <Button
        android:id = "@+id/show"
        android:text = "シングルトンに配列を保存"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content" />
</LinearLayout>

上記のコードでは、ボタンを1つ配置しています。ユーザーがこのボタンをタップすると、後述の処理によって配列の値がToastで表示される仕組みです。

ステップ3:MainActivity.java を実装する

src/MainActivity.java に以下のコードを追加します。

package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    Button show;
    int[] i1 = new int[] { 33, 12, 98 };
    singleTonExample singletonexample;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = findViewById(R.id.show);
        singletonexample = singleTonExample.getInstance();
        singletonexample.init(getApplicationContext());
        show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                singletonexample.storeArray(i1);
                Toast.makeText(singleTonExample.get(), singletonexample.getArray(),
                    Toast.LENGTH_LONG).show();
            }
        });
    }
}

※ 新しいAndroid Studioのプロジェクトでは、import文が androidx.appcompat.app.AppCompatActivity となっている場合がありますが、そのまま既存のimportを利用して問題ありません。

上記のコードでは、singleTonExample をシングルトンクラスとして利用しています。そこで、singleTonExample.java という名前で新しいクラスを作成し、以下のコードを追加しましょう。

package com.example.andy.myapplication;
import android.app.Dialog;
import android.content.Context;
import android.view.Window;
import java.util.Arrays;
public class singleTonExample {
    private Context appContext;
    private Dialog dialog;
    int[] i1;
    private static final singleTonExample ourInstance = new singleTonExample();
    public void init(Context context) {
        if(appContext == null) {
            this.appContext = context;
        }
    }
    private Context getContext() {
        return appContext;
    }
    public static Context get() {
        return getInstance().getContext();
    }
    public static synchronized singleTonExample getInstance() {
        return ourInstance;
    }
    private singleTonExample() { }
    public void show(Context context) {
        if (dialog != null && dialog.isShowing()) {
            return;
        }
        dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.layout_progress_dialog);
        dialog.setCancelable(true);
        dialog.show();
    }
    public void dismiss() {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }
    }
    public void storeArray(int[] i1) {
        this.i1 = i1;
    }
    public String getArray() {
        return Arrays.toString(i1);
    }
}

コードのポイント

  • init(Context):アプリケーションコンテキストを一度だけ保持するメソッドです。nullチェックにより、何度呼ばれても上書きされないようになっています。
  • getInstance():staticかつsynchronizedなメソッドで、常に同じシングルトンインスタンスを返します。
  • storeArray(int[]):渡された配列をシングルトンのフィールドに保存します。
  • getArray():保存された配列を文字列に変換して返すため、Toastなどでそのまま表示できます。

このように、Activityのライフサイクルに依存しないグローバルなコンテキストをシングルトンが保持することで、アプリ内のどこからでも安全にコンテキストや保存済みデータへアクセスできるようになります。

アプリを実行して確認する

それでは、実際にアプリケーションを動かしてみましょう。実機のAndroidスマートフォンをパソコンに接続しているものとします。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイス選択画面で自分のモバイル端末を選択すると、端末に以下のような初期画面が表示されます。

【Android】シングルトンとグローバルコンテキストで配列を保存する方法

続いて、画面上のボタンをタップしてみてください。グローバルコンテキストを使って、Toastに配列の値が表示されます。実行結果は以下の通りです。

【Android】シングルトンとグローバルコンテキストで配列を保存する方法

  1. Androidでグローバル変数を宣言する方法!シングルトンクラスを使った実装手順を徹底解説

    このチュートリアルでは、Androidアプリでグローバル変数のように使えるデータを宣言し、アプリ全体で共有する方法を解説します。具体的にはシングルトンクラスを作成し、どの画面からでも同じデータを保存・取得できるようにしていきます。 Androidでグローバル変数が必要になるケース Androidでは各Activityが独立したライフサイクルを持つため、通常のプログラミング言語のように単純にグローバル変数を宣言することは推奨されません。そこで定番となるのが、インスタンスがアプリ内に1つだけしか存在しないことを保証する「シングルトンパターン」です。これにより、画面をまたいで安全にデータを共有できま

  2. AndroidでJSON配列を反復処理する方法をステップごとに解説

    この記事では、Androidアプリ開発においてJSON配列(JSONArray)を反復処理する方法を、実際のサンプルコードとともにステップ形式で解説します。org.jsonパッケージのJSONObjectとJSONArrayクラスを使用して、JSON文字列からデータを取り出し、画面に表示するまでの一連の流れを学べます。完成イメージ本チュートリアルでは、従業員情報(ID・名前・給与)を含むJSON文字列を解析し、各要素を順番に読み取ってTextViewに表示するシンプルなアプリを作成します。手順1:Android Studioで新規プロジェクトを作成するまず、Android Studioを起動し