1

我有一个安卓应用程序。在一项活动中,我启动了这样的服务:

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

处理服务定义如下:

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

来自 IntentService javadoc

public void setIntentRedelivery(启用布尔值)

设置意图重新传递首选项。通常使用您喜欢的语义从构造函数中调用。

如果 enabled 为 true,onStartCommand(Intent, int, int) 将返回 START_REDELIVER_INTENT,因此如果此进程在 onHandleIntent(Intent) 返回之前终止,该进程将重新启动并重新传递意图。如果已发送多个 Intent,则保证仅重新交付最近的一个。

如果 enabled 为 false(默认),onStartCommand(Intent, int, int) 将返回 START_NOT_STICKY,如果进程终止,Intent 也会随之终止。

于 2014-09-01T16:43:54.697 回答