6

我做了一个远程服务,这个服务是由我的activity第一次启动时启动的,之后,activity总是查看服务是否启动以避免再次启动它。

该服务在 onCreate 函数中运行一些方法。该服务始终运行并在启动时启动。

问题(不是大问题,但我想知道为什么)是一旦创建了服务,如果我停止我的活动,就会调用 onTaskRemoved,这是正确的,但是几秒钟后,再次调用 oncreate 方法并启动服务再次。

知道为什么吗?我该如何控制呢?

<service
        android:name=".Service"
        android:icon="@drawable/ic_launcher"
        android:label="@string/service_name"
        android:process=":update_process" >
</service>

AndroidManifest.xml

if (!isRunning()) {
    Intent service = new Intent(this, UpdateService.class);
    startService(service);
} else {
    //Just to debug, comment it later
    Toast.makeText(this, "Service was running", Toast.LENGTH_SHORT).show();
}

如果服务未运行,则启动该服务的时间

4

2 回答 2

9

问题是你的服务默认是粘性的,这意味着它会在被杀死时重新启动,直到你明确要求它停止。

覆盖onStartCommand()服务中的方法,并让它返回START_NOT_STICKY。然后你的服务在被杀死时不会重新启动。

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    return START_NOT_STICKY;
}
于 2014-02-03T08:56:08.657 回答
7

尽管 Bjarke 的解决方案是有效的,但我想提出一个替代解决方案,涵盖可能需要在服务中执行任何恢复的情况。

onStartCommand()Android在重新启动您的服务后再次调用,通知您服务进程意外崩溃(因为它的任务堆栈已被删除),现在正在重新启动。

如果您查看 的intent参数onCreate(),它将是null(仅适用于此类重启),这表明 Android 正在重新创建您之前意外崩溃的粘性服务。

在某些情况下,明智的做法是NON_STICKY仅在此类重新启动时返回,执行任何需要的清理/恢复并停止服务,以便您优雅地退出。

当服务正常启动时,您仍然应该返回,STICKY否则您的服务将永远不会重新启动以让您执行任何恢复。

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    // intent is null only when the Service crashed previously
    if (intent == null) {
        cleanupAndStopServiceRightAway();
        return START_NOT_STICKY;
    }
    return START_STICKY;
}

private void cleanupAndStopServiceRightAway() {
        // Add your code here to cleanup the service

        // Add your code to perform any recovery required
        // for recovering from your previous crash

        // Request to stop the service right away at the end
        stopSelf();
}

另一种选择是请求您的服务停止(使用stopSelf())作为其中的一部分,onTaskRemoved()以便 Android 甚至不必首先终止该服务。

于 2015-07-21T03:29:33.937 回答