とあるエンジニアの拡張現実

普段の仕事で見つけた発見や面白い事書いていこうと思います(´◉◞౪◟◉)

AndroidのContextについて

今日ある友達から話を聞いてる時にContextの使い方について聞かれた。

よくプログラムを組む時にコンストラクタとかにthis渡していませんか??

まずActivityのContextがなぜthisなのか??

それはActivityがContextクラスを継承しているからです。なのでthisが使えるのですが、
このContextが実は割りと曲者だったりする訳ですw

まずよく使うContextにActivityのContextとApplicationのContextがあります。

ActivityのContextはよく使われるthis。
ApplicationContextはgetApplicationContext()です。

ではどのように使い分けるのか?間違うとどう問題あるのか?について書きます。

ActivityのContext。。。実はActivityのライフサイクルに依存します。
つまりActivityが破棄される時に破棄しないと・・・・メモリリークします。
なぜ破棄しないとまずいのか?メモリリークする原因とは?となると思いますが、
Contextが保持されたままだとActivityは論理的に終了します(onDestroy)が、
Activityのオブジェクトは破棄されません。finalize()が呼ばれない状態です。
finalize()とはClassがメモリも含め終了した時にGC実行時に呼ばれます。
finalize()はObjectクラスのメンバです。
要するにGCの対象とならないんですね!!

Activityは頻繁に破棄、生成されます。
回転しただけでもデフォルトの設定だとonDestroyされるんですよ・・・やっかい・・
デフォルトではシステムが現在のActivityを破棄しその状態を保持しながら新しいActivityを生成しようとするからなんです。なのでActivityのライフサイクルに依存させないとまずいんですね・・・



ではApplicationContext。。。これはアプリケーションに依存します。
つまりアプリケーションが生きている限り有効です。
アプリケーションに依存するクラス、複数のクラスから呼ばれたりするなどの時に使いましょう。ちなみにダイヤログでこのContextは使えません(´◉◞౪◟◉)
忘れましたがなんとかってエラーがでたような・・・

自分もまだまだ使い分けできてる自信はありませんが、前に調べてたので
なんとか説明できたけど合ってるよな???・・・・・うむ・・・

まとめると
ActivityContextはActivityと運命共同体
ApplicationContextはApplicationと運命共同体
コレだぜ(☝ ՞ਊ ՞)☝

そういや最近たまこマーケットのあんこちゃんが可愛くて眠れません。。。。