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;
}

このように修正して対応しました。

 

調べた場合、以下のブログを参考にしました。ありがとうございます。

 

関連する記事:

Facebookでコメント

コメント

  1. コメント 0

  1. トラックバック 0

*

return top