IntentService STICKY被破坏,但服务在Android 2.3.4中记录数据

时间:2012-06-10 15:45:30

标签: android android-intent android-service sticky intentservice

我有一个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.sending Something.Try#”和越来越多的数字。

问题:如果我已经通过调用stopService来停止它,为什么它会保持活着?

提前致谢!吉列尔莫。

2 个答案:

答案 0 :(得分:7)

documentation for IntentService明确声明您应该覆盖派生类中的onStartCommand()。你可能搞乱了IntentService的内部机制。

直接从Service派生您的课程,或使用IntentService已经为您提供的框架(用于启动/停止自己)。

答案 1 :(得分:2)

来自IntentService javadoc

public void setIntentRedelivery(已启用布尔值)

设置意向转发首选项。通常使用您首选的语义从构造函数调用。

如果enabled为true,则onStartCommand(Intent,int,int)将返回START_REDELIVER_INTENT,因此如果此进程在onHandleIntent(Intent)返回之前死亡,则将重新启动该进程并重新传递intent。如果已发送多个Intent,则只保证重新传送最新的Intents。

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