Context ActivityかApplicationか
ファイルダイアログを作るためにAlertDialogをベースにした外部クラスを作って呼び出したら詰まった。
new AlertDialog.Builder(Context context)
なぁなぁでやってるのが悪いのだけれども、このcontextになにを入れるべきか…
AlertDialog自体を取り扱っている解説は大体contextにthisを当てている。
ただこの場合、thisを入れれば例外が当然発生する。
このクラス(のアクティビティ)が呼び出しているわけじゃないから正しくない(たぶん)。
thisは便利なものだが、解説の場だと素人にとってなにを指しているかわからない。
完全な恥さらしの言い訳だけど…
で、Contextについて調べた。
内容は解説してくれているサイトがたくさんあるので割愛。
ただ、Activity ContextとApplication Contextが(おおまかに)あり、
Activity Contextはthisを、Application ContextはgetApplicationContext()が代表的に使われている。
ライフサイクル上メモリリークが発生するかもしないかもでgetApplicationContextが推されている…
ような書き方が多い。
とりあえず試してみた。
Intentなどはどちらでも機能する。
実行中の(Activity)クラスでAlertDialogを生成する場合
クラス名.thisは成功
getApplicationContext()はWindowManager BadTokenException
あと、getBaseContext()も同例外発生
今回のように実行中の(Activity)クラスから(ファイルダイアログ用)外部クラスを呼び出してAlertDialogを生成する場合
- context自体に
- this 不可(IlleagalStateException発生)
- getApplicationContext() 不可(WindowManager BadTokenException発生)
- 呼び出し元のActivityクラス(AAA.class)からContextを受け取る。
- AAA.thisをContextとして渡す 可能
- getApplicationContext()を同上 不可(WindowManager BadTokenException発生)
getApplicationContext()は向かないようで、例外が発生する。
結局呼び出し元のクラスからActivity Contextを渡して、AlertDialogの生成に当てると機能する。
解説を見てて違和感があったけど、結局のところ適材適所みたい。
そもそもを理解した上でメモリリークに注意した使い分けろをしろということなんだろう。
あたりまえですよね…
以下、今回のことと近いようなことをきちんと解説しているサイトとこの後詰まるであろうnull対処の引用
ものぐさDev AndroidのContextについて
http://monogusadev.blogspot.jp/2012/08/androidcontext.html
FLYING AndroidアプリでContextを持ち回したい話
http://d.hatena.ne.jp/tondol/20120616/1339786005