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) ... } }
各々の関数が、システムよりコールバックされるタイミングは表の通りです。
コールバックのタイミング | |
---|---|
onCreate | Applicationインスタンスが作成される時 (プロセスが作成されるタイミングと等価) |
onTerminate | Applicationインスタンスが破棄される時 (プロセスが削除されるタイミングと等価) 注意:エミュレータは実行するが、実機は実行しない |
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()}") } } } } } }
関連記事: