1

私はAndroidアプリケーションを持っています。あるアクティビティでは、次のようなサービスを開始します。

Intent startIntent = new Intent(_context, HandlingService.class);
_context.startService(startIntent);

HandlingServiceは次のように定義されています。

public class HandlingService extends IntentService

次に、HandlingService内にこれがあります:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, startId, startId);
    Log.v(ApplicationName,"HandlingService.onStartCommand");
    if ((flags & START_FLAG_RETRY) == 0){
        Log.v(ApplicationName,"Service is restarting");
    }
    return START_STICKY;
}

この:

@Override
protected void onHandleIntent(Intent sourceIntent) {
    Log.v(ApplicationName, "HandlingService.onHandleIntent");
    sendSomething(); 
}

そして最後に:

protected void sendSomething() {
    while (numberOfTry > 0) {
        numberOfTry++;
        Log.v(ApplicationName,"HandlingService.sending Something. Try# " + numberOfTry);
    }
}

numberOfTryは1から始まります。

次に、サービスを開始するアクティビティから、キャンセルボタンをクリックすると、次のように呼び出されます。

Intent stopIntent = new Intent(CallingActivity.this, HandlingService.class);
CallingActivity.this.stopService(stopIntent);

HandlingService.OnDestroyが呼び出されているのがわかりますが、「HandlingService.sendingSomething.Try#」とその数が増えているログが引き続き表示されます。

質問:stopServiceの呼び出しですでに停止しているのに、なぜそれが存続するのですか?

前もって感謝します!ギレルモ。

4

2 に答える 2

7

IntentServiceのドキュメントには、派生クラスでオーバーライドしてはならないことが明示的に記載されています。onStartCommand()あなたはおそらくの内部の仕組みを台無しにしているでしょうIntentService

クラスを直接派生させるか、すでに提供Serviceされているフレームワークを使用しIntentServiceます(それ自体を開始/停止するため)。

于 2012-06-11T07:28:18.937 に答える
2

IntentServicejavadocから

public void setIntentRedelivery(ブール値が有効)

インテント再配信プリファレンスを設定します。通常、好みのセマンティクスでコンストラクターから呼び出されます。

enabledがtrueの場合、onStartCommand(Intent、int、int)はSTART_REDELIVER_INTENTを返すため、onHandleIntent(Intent)が戻る前にこのプロセスが終了すると、プロセスが再開され、インテントが再配信されます。複数のインテントが送信された場合、最新のインテントのみが再配信されることが保証されます。

enabledがfalse(デフォルト)の場合、onStartCommand(Intent、int、int)はSTART_NOT_STICKYを返し、プロセスが終了すると、Intentも一緒に終了します。

于 2014-09-01T16:43:54.697 に答える