0

フォアグラウンドで実行する必要があるサービスを開発しています。ユーザーはアクティビティを通じてサービスのオン/オフを切り替えることができます。したがって、基本的に、アクティビティは強制終了される可能性がありますが、ユーザーによって停止されない限り、サービスは安全です。

しかし、私はこの問題を抱えています:サービスがオンになっている場合、サービスをオフにする方法は?つまり、アクティビティが強制終了されてから再起動された場合、開始されたサービスの呼び出しの意図についての参照が得られませんstopService

以下は私の現在のコードです。同じアクティビティによってサービスが開始された後にユーザー呼び出しが非アクティブ化された場合は、正常に機能します。ボタンのステータスは常に正しいですが、OSによってアクティビティが再開されると、this.serviceIntentnullになります。

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ますが、それについては安全ではありません。他に方法がない場合は、それを使用します。

4

1 に答える 1

1

アクティビティのonCreateでserviceIntentを初期化するだけです...サービスを開始し、アクティビティを強制終了し、再度開いて、同じserviceIntentでサービスを停止できます。

于 2013-03-02T10:30:32.207 に答える