🍃

Androidアプリ開発におけるContextの使い分け

2020/10/13に公開

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.

https://developer.android.com/reference/android/content/Context

Contextとは抽象クラスであり、ActivityやApplicationのスーパークラスにあたります。
リソースの取得やActivityの起動などで必要となり、Androidアプリ開発の中でも至る所で要求されるものなので馴染みがある方も多いと思います。

Contextの種類

Activity Context

  • Activityのライフサイクルに従っている
  • Acticityが終了したにも関わらずContextへの参照が残っていると、メモリリークが発生する可能性あり

Application Context

  • Viewまわりのメソッドで使用すると、Activityに設定したThemeが適用されない
  • AlertDialog.Builderで使用するとクラッシュする
  • アプリ全体のライフサイクルで使用する場合、十分に検討した上で使う
  • ライブラリの初期化では必ずApplicationContextを使う

Contextの取得方法

  1. Activity の this
    • Activityが取得できる
  2. Activity や Application の getApplicationContext()
    • Applicationが取得できる
  3. View や Fragment の getContext()
    • Activityが取得できる

どのように使い分けるか

基本的にはActivityの生存期間で足りる場合(特にViewまわり)はActivityContextを使い、アプリ全体のライフサイクルで使用する場合のみApplicationContextを使うと良さそうです。

まとめ

Contextは使う機会が多いにも関わらず実際にどのような物なのかがわかりにくいですが、雰囲気で使用すると意図しないメモリリークやクラッシュを引き起こすので使用する際は適切なContextを使うようにしましょう。

Discussion