taoru's memo

Objective-c,cocos2d,など開発についてのメモ(andoroidも少しだけ)

ダイアログ表示でBadTokenExceptionが出る

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( getApplicationContext() );

例えばhogeActivity内で、上記のようにAlertDialogを作成する処理を書くと、

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

というエラーが出て落ちてしまう。

で、エラー名でぐぐった
ダイアログ表示時(Dialog#show)にBadTokenException
上記ブログ様によるとサービスのコンテキストでダイアログは表示できないらしい。

サービスとはなんぞや。
Androidで動く携帯Javaアプリ作成入門(7)常駐アプリが作成できるAndroidの“サービス”とは

むむむ…よくわからない。
バックグラウンドで動かし続けたい処理なんかに使うみたい。



なぜgetApplicationContext()で取得したコンテキストが、サービス扱いなのかよくわからないが、
以下のようにしたらエラー落ちしないで正常っぽく動いた。

hogeActivity.java

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( hogeActivity.this );

とあるプロジェクトで、前任者がこう書いていたものをマネした。
自分自身のクラス(アクティビティクラス)をコンテキストとして渡している。


しかしこの書き方では、参照が残るとかなんとか
Androidアプリのメモリリークを調査する
上記ブログ様の記事、「Contextに注意」の項目でActivity.thisが登場している。

getApplicationContext()を使うと参照が残らない…のか?
知識不足で全然理解していないので、もっと勉強が必要ですね。。

QLOOKアクセス解析