フォアグラウンドで実行する必要があるサービスを開発しています。ユーザーはアクティビティを通じてサービスのオン/オフを切り替えることができます。したがって、基本的に、アクティビティは強制終了される可能性がありますが、ユーザーによって停止されない限り、サービスは安全です。
しかし、私はこの問題を抱えています:サービスがオンになっている場合、サービスをオフにする方法は?つまり、アクティビティが強制終了されてから再起動された場合、開始されたサービスの呼び出しの意図についての参照が得られませんstopService
。
以下は私の現在のコードです。同じアクティビティによってサービスが開始された後にユーザー呼び出しが非アクティブ化された場合は、正常に機能します。ボタンのステータスは常に正しいですが、OSによってアクティビティが再開されると、this.serviceIntent
nullになります。
protected boolean isServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (SynchronizationService.class.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
@Override
protected void onResume() {
super.onResume();
this.togglingByCode = true;
this.butActivate.setChecked(this.isServiceRunning());
this.togglingByCode = false;
}
public void onActivateButtonClick(final boolean pIsChecked) {
if (this.togglingByCode) { return; }
if (pIsChecked) {
this.saveSettings();
this.serviceIntent = new Intent(this, SynchronizationService.class);
this.serviceIntent.putExtra(KEY_WEBSERVICE, this.txtWebService.getText().toString());
this.serviceIntent.putExtra(KEY_PASSWORD, this.txtPassword.getText().toString());
this.serviceIntent.putExtra(KEY_INTERVAL, Integer.parseInt(this.txtRefreshInterval.getText().toString()));
this.serviceIntent.putExtra(KEY_TIMEOUT, this.preferences.getInt(KEY_TIMEOUT, DEFAULT_TIMEOUT));
this.serviceIntent.putExtra(KEY_RETRY, this.preferences.getInt(KEY_RETRY, DEFAULT_RETRY));
this.startService(this.serviceIntent);
} else {
this.stopService(this.serviceIntent);
this.serviceIntent = null;
}
}
サービスを正しく停止する方法を教えてください。ありがとうございました。
追伸:私はそれを作るトリックを知っていserviceIntent
static
ますが、それについては安全ではありません。他に方法がない場合は、それを使用します。