为什么我的服务停止了?

时间:2014-11-19 22:30:30

标签: android service android-context

我想知道必须满足哪些条件才能让Android停止Service,除了显而易见的内存不足之外。

请参阅,我运行引导Service,持有本地BroadcastReceiver。服务本身包含一个状态机,因此我从一个自举状态转换到另一个状态。每个状态转换函数都以AsyncTaskIntentService开始,一旦完成,它会将Intent发送回服务,让它知道任务是执行成功。然而,在此期间,服务停止了,因此意图被分配到任何东西,这是令人沮丧的。

我不想使用Foreground Service而且我不想为了让我的服务保持活力而四处乱转。我也不想依赖于onHandleIntent()的{​​{1}},因为IntentService会丢失其所有状态,这意味着所有成员一旦通过就会被取消,所以当stateA完成并且stateB应该开始,整个状态机是空的,所有以前的状态都消失了,等等....

我将IntentService上下文提交给每个Services / IntentService,我想,只要他们拥有服务上下文的引用,AsnycTask就不会停止。可悲的是,事实并非如此......

我是否必须在ServicedoInBackground()时调用上下文中的方法,只是为了让AsyncTask保持活着状态?

2 个答案:

答案 0 :(得分:0)

除系统内存不足外,如果您的服务超出一定的内存量(check limitations),您可以终止您的进程。

与服务流程一样,前台流程可以延长服务的使用寿命,但您也无法保证。

我认为你最好的机会是在START_STICKY模式(link)中制作符合服务的逻辑。

答案 1 :(得分:0)

  

我想知道必须满足哪些条件才能让Android停止服务,除了显而易见的内存不足之外。

用户可以出于任何原因随时停止服务,可以通过直接停止单个服务,或者(更有可能)终止整个过程。

如果服务崩溃,Android会单独停止服务。更常见的是,它终止整个过程以回收该进程的内存以供其他用途。

  

我运行一个自举服务,持有本地BroadcastReceiver

我怀疑任何人,但你知道“bootstrapping”在这种情况下意味着什么。

  

每个状态转换函数都启动AsyncTask或IntentService,一旦完成,它会将Intent调度回Service,让它知道任务已成功执行。

使用AsyncTask中的Service通常毫无意义。您不希望在Service中的主应用程序线程上执行任务,而AsyncTask背后的要点是在主应用程序线程上执行某些操作(例如,onPostExecute())。使用Thread

使用IntentService中的Service毫无意义且浪费。你已经有了Service - 它正在进行“自举”。您不需要其他 Service。使用Thread

  

然而,在此期间,服务暂停,因此意图被分配到任何东西,这是令人沮丧的。

更有可能的是,整个过程都消失了。

  

我将Services上下文提交给每个IntentService / AsnycTask

我不完全清楚“提交”在这里是什么意思,但如果您将ContextService)传递给另一个ContextIntentService),那就是严重的代码味道。

  

只要他们持有服务上下文的引用,服务就不会停止

没有。此外,这些都不会阻止Android终止您的流程。

  

我是否必须在doInBackground()和AsyncTask上调用上下文中的方法,只是为了让服务保持活动状态?

不,你需要保持你的状态机持久(a.k.a。,一个文件),这样如果你的进程由于某种原因终止,当你再次运行时,你可以从你离开的地方继续。