始めに
こんにちは、OWNR by RENOSY Android開発のSugeunです。🤓
最近、OWNR by RENOSYはチャット機能を追加しました。弊社で不動産物件を購入いただいたお客様はご利用いただけます。是非気軽に使ってください。
今回は今までAndroid開発中でApplication ContextとActivity Contextの使い分けを理解できず使ってましたが二つの概念を勉強して理解した概念を記事で書きました。
Context存在理由
"Contextはアプリの全てのところで使われる"と言っても過言ではないです。
アプリのPackageName、Resourceの情報とstartActivityなどはContextを通じて使用することができるからです。及びContextはシステムのリソースの確認や端末にある情報にアクセス確保にもContextが必要です。
Android アプリケーション内部には多数のActivityが存在しています。ActivityクラスはContextクラスを継承しています。
Application Contextについて
Application ContextはSingletonとしてApplicationが生きている間は決して死んだり変わったりしません。
applicationContext
を通じてApplication Contextのインスタンス得ることができます。
Application ContextのActivityを参照するとActivityがDestroyされてもSingletonの性格上、参照が維持されるのでメモリ漏れが発生するかも知りません。
// Application Contextを得る方法 // Java / Kotlin Activity#getApplicationContext()
Activity Contextについて
Activity ContextはApplication Contextと違いSingletonではないです。
ActivityのLife Cycle従っているので現在使っているActivityがDestroyされると一緒にActivity ContextもDestroyされます。
// Activity Contextを得る方法 // Java / Kotlin Activity#getContext()
Contextを使い分け
Contextを使うときはスコープ範囲が広いApplication Contextの方がApplicationが生きているうちに決してNullにならないのでNull SafeになるからActivity Contextより安全に見えるかもしれません。
ですがアプリ開発においてなるべくApplication ContextよりLife Cycleを従っているActivity Contextを使うのをお勧めします。
例えばActivityでDialogの表示, StartActivityメソッド, LayoutをInflateはActivityが閉じられた時(Destroy)に一緒にDestroyされてもいいContextを使うときはActivity Contextを使うのが良さそうです。🙂
AlertDialog.Builder(requireContext()) // Activity Context .setTitle(R.string.error_title) .setMessage("message") .setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() } .create() .show()
Dialogの場合Application ContextではなくActivity Contextを使います。
AlertDialogはActivityがありそのActivityのView上に写すのでLife Cycleを従いrequireContext()
を使う必要があります。😃
まとめ
Contextはアプリ開発においてとっても重要な概念です。
今後は今使っているContextはLife Cycle的にどんなContextを使えばいいのかの認識して使うようにしましょう。😸