2013-02-08 39 views
5

我做了一个远程服务,这个服务是在我第一次启动时通过我的活动启动的,之后,如果服务启动,活动总是会看起来避免再次启动它。服务在onTaskRemoved后重新创建

该服务在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(); 
} 

当如果它没有运行

+0

我不清楚你的问题。但不要担心服务的多个实例。从第二次调用['startService()'](http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent))不会启动服务两次,如果它已经在运行。 – 2013-02-08 11:55:47

+0

@LaiVung多重实例不是问题,问题在于活动停止后调用oncreate的方法,所以onCreate内部的方法再次被调用,我不想要。 – Marcel 2013-02-08 12:02:53

+0

你是否在你的活动结束时开始了一些事情(比如'onDestroy()')? – 2013-02-08 12:20:12

回答

8

的问题,该服务已启动的是你的服务是每默认粘,这意味着它将在死亡后重新启动,直到您明确要求停止。

覆盖您的服务中的onStartCommand()方法,并让它返回START_NOT_STICKY。那么你的服务在遇难时将不会重新启动。

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    return START_NOT_STICKY; 
} 
+0

我已经解决了,这是如何,谢谢任何方式 – Marcel 2014-02-07 18:05:42

+1

@Marcel:现在其他人寻找这个问题的答案也可以看到解决方案:) – 2015-01-29 09:24:14

+0

开始不粘手一个很好的解决方案或onTaskRemoved。 – Minkoo 2017-03-04 08:01:05

6

虽然Bjarke的解决方案是有效的,我想提出覆盖的地方可能需要进行的任何服务的情况下恢复的替代解决方案。

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

如果你看看onCreate()intent的说法,这将是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的甚至没有杀摆在首位的服务的一部分。

+0

你能保存一些东西到数据库吗? – 2017-01-20 06:57:00

相关问题