Androidでグローバルコンテキストを使ってシングルトンを実装する方法
具体的な実装に入る前に、まず「シングルトンデザインパターン」とは何かを簡単に確認しておきましょう。シングルトンとは、あるクラスのインスタンスがアプリケーション内で1つだけしか生成されないよう制限するデザインパターンのことです。代表的な用途としては、並行処理の制御や、アプリケーション全体からデータストアへアクセスするための一元的なアクセスポイントの提供などが挙げられます。
このチュートリアルでは、Androidアプリにおいてグローバルコンテキスト(ApplicationContext)と組み合わせてシングルトンを使用する方法を解説します。
なお、シングルトンにコンテキストを持たせる場合は、ActivityやFragmentのコンテキストではなく getApplicationContext() を使うのがポイントです。Activityの参照を保持したままだと、画面が破棄された後もインスタンスがメモリ上に残留し、メモリリークの原因になってしまうためです。
ステップ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="start dialog in singleTone"
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;
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) {
Toast.makeText(singleTonExample.get(), "Showing with global context", Toast.LENGTH_LONG).show();
}
});
}
}
ここでは singleTonExample クラスをシングルトンとして利用しています。続いて、同じパッケージ内に singleTonExample.java という新しいクラスを作成し、以下のコードを追加しましょう。
package com.example.andy.myapplication;
import android.app.Dialog;
import android.content.Context;
import android.view.Window;
public class singleTonExample {
private Context appContext;
private Dialog dialog;
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() { }
}
コードのポイント
- getInstance():synchronized 修飾子を付けることで、マルチスレッド環境でも安全に唯一のインスタンスを取得できます。
- init(Context):アプリケーションコンテキストを保存します。nullチェックにより、すでに設定済みの場合は上書きしない設計になっています。
- get():アプリ内のどこからでもグローバルなApplicationContextを取得できる静的メソッドです。これにより、Activityに依存しない場所(Dialogなど)でもUI操作が可能になります。
アプリケーションを実行してみる
それでは、アプリを実際に動かしてみましょう。実機のAndroidスマートフォンをPCに接続しているものとして説明を進めます。Android Studioでプロジェクト内の任意のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイス選択画面で自分のスマートフォンを選択すると、端末側に次のような初期画面が表示されます。

表示されたボタンをタップすると、グローバルコンテキスト経由で次のようにToastが表示されます。

-
AndroidのFragmentでコンテキスト(Context)を取得・使用する方法を徹底解説
はじめに この記事では、Androidアプリ開発においてフラグメント(Fragment)内でコンテキスト(Context)を取得して使用する方法を、実際のサンプルコードとともにステップごとにわかりやすく解説します。 フラグメントは単体では動作せず、必ず親となるアクティビティ(Activity)に紐づいて実行されます。そのため、フラグメント内でコンテキストが必要な場面では、getActivity()メソッドなどを使って親アクティビティのコンテキストを取得するのが基本の考え方です。 手順1:新しいプロジェクトを作成する Android Studioを起動し、メニューから「File」→「New
-
RecyclerViewでConstraintLayout(制約レイアウト)を使う方法【Android Studio解説】
この記事では、Androidアプリ開発においてRecyclerViewの各アイテムにConstraintLayout(制約レイアウト)を使用する方法を、ステップごとにわかりやすく解説します。ConstraintLayoutは、ネストしたレイアウト構造をフラットな階層で表現できるため、RecyclerViewのように多数のビューを繰り返し描画する場面でパフォーマンス向上が期待できるレイアウトです。リストアイテムの描画コストを下げたい場合にぜひ活用しましょう。ステップ1:新規プロジェクトを作成するまず、Android Studioを起動し、メニューから File ⇒ New Project を選択