Service の初期化ブロックで、インテントの初期化に失敗
Android のサービス中に初期化ブロックを置いて初期化しようとすると、 NullPointerException が発生する事態に遭遇。
コードは、以下のような単純なもの
Intent intent = new Intent("ACTION_HOGE", null, this, HogeService.class);
第三引数は、パッケージのコンテキストなので、this でなく getApplicationContext() に置き換えてみたけどダメ。
第二引数で Uri を null で指定するのがまずいのかと思い、以下のように2段階にしてみたけどこれもダメ。
Intent intent = new Intent("ACTION_HOGE");
intent.setClass(getApplicationContext(), HogeService.class);
この場合、最初の new Intent は実行され、次の setClass で失敗する。NullPointerException が発生することから、初期化ブロック内では値が確定していない「何か」を参照してしまっているということ?
んー、何か Java のお約束があるのか、もしくは単純なポカをやってるのか。
初期化ブロックでなく、コンストラクタもしくは onCreate() に記述したらどうなるか?
週末にゆっくり考えてみよう。
あまり詳細に調べていないけど、どうも getApplicationContext() は問題ありそう。考えてみれば、初期化ブロック(やコンストラクタ)は、サービス開始(onCreate)前に動くコードなので、そこでコンテキスト(この場合の this や、getApplicationContext())を使用するのはまずいのではないかと思う。
結局、コンテキストを使用するコードをサービスに書く場合は、onCreate() 以降(に実行されるコード)に書く必要がある。ということかな。