Androidアプリ開発におけるContextの使い分け
Androidアプリ開発で使用するContextにはいくつか種類があります。
ただハマりポイントも多く、状況に応じて適切なContextを使用しないと意図しないメモリリークやクラッシュを発生させる可能性があります。
Contextとは
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
Contextとは抽象クラスであり、ActivityやApplicationのスーパークラスにあたります。
リソースの取得やActivityの起動などで必要となり、Androidアプリ開発の中でも至る所で要求されるものなので馴染みがある方も多いと思います。
Contextの種類
Activity Context
- Activityのライフサイクルに従っている
- Acticityが終了したにも関わらずContextへの参照が残っていると、メモリリークが発生する可能性あり
Application Context
- Viewまわりのメソッドで使用すると、Activityに設定したThemeが適用されない
- AlertDialog.Builderで使用するとクラッシュする
- アプリ全体のライフサイクルで使用する場合、十分に検討した上で使う
- ライブラリの初期化では必ず
ApplicationContext
を使う
Contextの取得方法
- Activity の this
- Activityが取得できる
- Activity や Application の
getApplicationContext()
- Applicationが取得できる
- View や Fragment の
getContext()
- Activityが取得できる
どのように使い分けるか
基本的にはActivityの生存期間で足りる場合(特にViewまわり)はActivityContext
を使い、アプリ全体のライフサイクルで使用する場合のみApplicationContext
を使うと良さそうです。
まとめ
Contextは使う機会が多いにも関わらず実際にどのような物なのかがわかりにくいですが、雰囲気で使用すると意図しないメモリリークやクラッシュを引き起こすので使用する際は適切なContextを使うようにしましょう。
Discussion