Androidのサービスでintentを使うとNullPointerExceptionで落ちるのを回避
Androidのサービスでintentを使うとNullPointerExceptionで落ちるのを回避
AdnroidのサービスをstartServiceで呼び出した場合、
「onStartCommand」第1引数のintentを使用するとNullPointerExceptionが発生する場合があるので注意が必要です。
サービス起動時のソースコードとサービス側のソースを見てる
サービス起動側
// サービス起動 Intent service = new Intent(getApplication(), LightService.class); service.putExtra(LightService.CALL_INTENT, mode); startService(service);
サービス側
@Override public void onStart (Intent intent, int startId) int mode = intent.getIntExtra(CALL_INTENT, INTENT_ACTIVITY); if (mode == INTENT_WIDGET) { onModeSwitch(true); } else { onModeSwitch(false); } }
これで起動をかけるとサービス側の3行目でNullPointerExceptionが発生して落ちる場合があります。
ここで一番の問題なのは「onStart」を使ってしまっている事です。
「onStart」は現在では「This method is deprecated.」となっており
代わりに「onStartCommand」というメソッドを使用しないといけないということらしいです。
それともう一点、「onStartCommand」を使用した場合にも問題があります。
ドキュメントの以下の用に記述されています。
intent | The Intent supplied to startService(Intent) , as given. This may be null if the service is being restarted after its process has gone away, and it had previously returned anything except START_STICKY_COMPATIBILITY . |
---|
ようするに、戻り値によっては引数のintent変数にNULLが入ってくる場合があるようです。
なので、NULLが入ってこないように戻り値を「START_STICKY_COMPATIBILITY」にして、
大丈夫なはずだが、念の為にintentに対しNULLチェックの追加(これは無駄な処理のハズ・・・)
で修正後のサービス側のソースがこちら
@Override public int onStartCommand(Intent intent, int flags, int startId) { int mode = INTENT_ACTIVITY; if (intent != null) mode = intent.getIntExtra(CALL_INTENT, INTENT_ACTIVITY); if (mode == INTENT_WIDGET) { onModeSwitch(true); } else { onModeSwitch(false); } return START_STICKY_COMPATIBILITY; }
このように修正して対応しました。
調べた場合、以下のブログを参考にしました。ありがとうございます。
関連する記事:
- 暗黙的インテントの呼び出しでActivityNotFoundExceptionを防ぐ方法
- Webサービスで便利!faviconをpng画像として取得出来るGoogleのAPI
- さくらのVPSにMongoDBをインストール
- AndroidのBOOT_COMPLETEDの受信とテスト
- さくらのVPSにredisをインストール
コメント 0