アプリ全体から参照可能なインスタンス(Application)

投稿日:  更新日:

Applicationクラスのインスタンスは、アプリが起動する際に作成されて、アプリが起動している限り存在し続けます。

しかも、全てのアプリケーションコンポーネントから参照可能なインスタンスです。

ですので、アプリ全体に関連する共有データを管理する場合に便利です。

例えば、「アプリの環境設定データ」などが考えられます。

今回は、このApplicationクラスの使い方を、まとめます。

※環境:Android Studio Iguana | 2023.2.1 Patch 2
    Kotlin 1.9.0
    Compose Compiler 1.5.1

スポンサーリンク

Applicationとは

Applicationについて、ドキュメントは次のように説明しています。

Base class for maintaining global application state. 
---
グローバルなアプリケーションの状態を維持(管理)するための基本クラス。

このように説明される理由は、次のような特徴を持つためです。

 (1)インスタンス化のタイミング 

Applicationのインスタンスは、アプリのプロセスが作成される際に他のクラス(Activityなど)よりも前に作成され、アプリのプロセスが削除される際に破棄されます。

 (2)インスタンスの参照 

Applicationのインスタンスは、アプリ内で起動される全てのアプリケーションコンポーネント(Activity,Service,Reciever)から参照可能です。

インスタンスの参照

 (3)インスタンスの生存期間 

アプリケーションコンポーネントはアプリの起動中に作成と破棄を繰り返しますが、Applicationのインスタンスはアプリのプロセスが存在している限り破棄されません。つまり、「インスタンスの生存期間≒プロセスの生存期間」です。

インスタンスの生存期間

ですので、アプリ全体の状態を管理する役割に適しています。

※プロセスについては「アプリを実行しているプロセスIDとプロセス名」を参照
※アプリケーションコンポーネントについては「アプリケーションコンポーネント(App component)」を参照

スポンサーリンク

Applicationの作成

Applicationを使うには次の2つを行います。

  • (1)サブクラスを作成
  • (2)システムへ登録

これにより、全てのアプリケーションコンポーネントから参照が可能になります。

サブクラスの作成

Applicationのサブクラスを作成します。

class CmnApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        ...
    }

    override fun onTerminate() {
        super.onTerminate()
        ...
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        ...
    }

    override fun onLowMemory() {
        super.onLowMemory()
        ...
    }

    override fun onTrimMemory(level: Int) {
        super.onTrimMemory(level)
		...
    }
}

各々の関数が、システムよりコールバックされるタイミングは表の通りです。

コールバックのタイミング
onCreateApplicationインスタンスが作成される時
(プロセスが作成されるタイミングと等価)
onTerminateApplicationインスタンスが破棄される時
(プロセスが削除されるタイミングと等価)
注意:エミュレータは実行するが、実機は実行しない
onConfigurationChanged構成の変更が行われた時
※構成の変更:
  端末の向き、Night/Dayモード、機内モードOn、などの変更
onLowMemoryメモリー不足により、アプリのメモリー使用量を削減する必要がある時
onTrimMemory不要なメモリーを削除すべきであると、システムが判断した時

システムへ登録

Applicationのサブクラス名をマニフェストファイルへ記述して、アプリケーションとの連携をシステムへ登録します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:name=".CmnApplication"
        android:theme="@style/Theme.Application"
        tools:targetApi="31">
        <activity> ... </activity>
    </application>

</manifest>
スポンサーリンク

Applicationの参照

次のようなApplicationのサブクラスがあったとします。

class CmnApplication : Application() {

    val samplePropertyA: String = "PropertyA"
    lateinit var samplePropertyB: String

    override fun onCreate() {
        super.onCreate()
        samplePropertyB = "PropertyB"
    }

    fun sampleFunctionC(): String { return "FunctionC" }
}

Activity#getApplication()またはService#getApplication()を使って、Applicationのインスタンスが取得可能です。

後は、そのインスタンスを使って、Applicationのメンバへアクセスします。

以下はActivtyの例です。MainおよびSubActivityの両方から、同様にApplicationへアクセスできています。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val _application = (application as CmnApplication)

        setContent {
            ApplicationTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Column {
                        Text(text = "Main A : ${_application.samplePropertyA}")
                        Text(text = "Main B : ${_application.samplePropertyB}")
                        Text(text = "Main C : ${_application.sampleFunctionC()}")
                    }
                }
            }
        }
    }
}
class SubActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val _application = (application as CmnApplication)

        setContent {
            ApplicationTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Column {
                        Text(text = "Sub A : ${_application.samplePropertyA}")
                        Text(text = "Sub B : ${_application.samplePropertyB}")
                        Text(text = "Sub C : ${_application.sampleFunctionC()}")
                    }
                }
            }
        }
    }
}

Applicationの参照サンプル

スポンサーリンク

関連記事:

アプリを構成する最上位の構成要素がアプリケーションコンポーネント(App component)です。 アプリケーションコンポーネントの概要をまとめます。 ...
「インテントの解決」はシステム内でアプリケーションコンポーネントを選択する処理のことです。 この選択する処理の流れが複雑で、ちょっと癖がありあます。 ここでは「インテントの解決」の処理の流れについてまとめます。 ...
アプリを構成する最上位の構成要素がアプリケーションコンポーネント(App component)です。 Activityはアプリケーションコンポーネントの1つです。アプリケーションの画面と処理を構築します。 Activityについてまとめます。 ...
アプリを構成する最上位の構成要素がアプリケーションコンポーネント(App component)です。 Content Providerはアプリケーションコンポーネントの1つです。アプリケーションが管理するデータを公開(共有)します。 Content Providerについてまとめます。 ...
スポンサーリンク